我正在使用包含以下列的年份数据的表格:
Table "myData" ((
"Status" character varying,
"Project" character varying,
"Product" character varying,
"Identifier" character varying,
"Submittedon" date
)
等,
现在获取特定月份提交的记录数。比如说2013年4月的记录数,我正在使用:
select count("Status") as April2013
from "myData"
where (
"SubmittedOn" > (current_date - 90)
and "SubmittedOn" < (current_date - 60)
)
结果:
April2013
--------
62
现在我的要求是获取过去6个月的记录数。我的意思是我希望我的输出有以下任何格式:
FORMAT 1:
FORMAT 2:
6MonthsCount
-------------
34
23
44
41
18
9
答案 0 :(得分:4)
select
date_trunc('month', submittedOn) "month",
count("Status") total
from "myData"
group by 1
order by 1
答案 1 :(得分:3)
这看起来像一个“Pivot”-Table所以使用tablefunc扩展的crosstab()函数 (http://www.postgresql.org/docs/current/static/tablefunc.html):
CREATE TABLE mydata (status text, submitteton date);
INSERT INTO mydata VALUES ('a', '2013-01-02'), ('b', '2013-01-05'), ('c', '2013-02-09'), ('d', '2013-04-11');
SELECT extract(month from submitteton) as month, count(*) FROM mydata GROUP BY month;
month | count
-------+-------
1 | 2
2 | 1
4 | 1
CREATE EXTENSION tablefunc;
SELECT
*
FROM
crosstab(
'SELECT
extract(year from submitteton)::int as year,
extract(month from submitteton) as month,
count(*)::int
FROM
mydata
GROUP BY 1,2
ORDER BY 1,2',
'SELECT * FROM generate_series(1, 12)'
) as ct(
year int,
jan int, feb int, mar int, apr int, may int, jun int,
jul int, aug int, sep int, oct int, nov int, dec int
)
ORDER BY
year
;
year | jan | feb | mar | apr | may | jun | jul | aug | sep | oct | nov | dec
------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----
2013 | 2 | 1 | | 1 | | | | | | | |
答案 2 :(得分:1)
您应该使用interval和date_trunc,而不是使用明确的天数:
denis=# select date_trunc('month', now()) as d;
d
------------------------
2013-06-01 00:00:00+02
(1 row)
denis=# select date_trunc('month', now()) - interval '2 months' as d;
d
------------------------
2013-04-01 00:00:00+02
(1 row)
要生成过去6个月,请使用generate_series()
:
denis=# select d as start, d + interval '1 month' as stop
from generate_series(date_trunc('month', now()) - interval '6 month',
date_trunc('month', now()),
'1 month') d;
start | stop
------------------------+------------------------
2012-12-01 00:00:00+01 | 2013-01-01 00:00:00+01
2013-01-01 00:00:00+01 | 2013-02-01 00:00:00+01
2013-02-01 00:00:00+01 | 2013-03-01 00:00:00+01
2013-03-01 00:00:00+01 | 2013-04-01 00:00:00+02
2013-04-01 00:00:00+02 | 2013-05-01 00:00:00+02
2013-05-01 00:00:00+02 | 2013-06-01 00:00:00+02
2013-06-01 00:00:00+02 | 2013-07-01 00:00:00+02
(7 rows)
http://www.postgresql.org/docs/current/static/functions-srf.html
从那里,带有count / group by的简单连接将产生预期的结果。
(注意:如果您需要没有时区的时间戳,请将now()
替换为例如(now() at time zone 'utc')::timestamp(0)