2011-06-21 62 views
1

我有一个包含createddate的记录表。我想返回过去6个日历月中的每个月的新记录,包括本月的部分月份。我很了解SQL Server,但不熟悉PostgreSQL。在PostgreSQL中查找过去n个月中的每个月的新记录

我已经能够与此查询以获取滚动个月的数据:从5/22-6/21

select 
COUNT(ID) as Total, 
COUNT(CASE WHEN createddate between (now() - '1 month'::interval)::timestamp AND now() THEN AG.ID END) as ThisMonth, 
COUNT(CASE WHEN createddate between (now() - '2 month'::interval)::timestamp AND (now() - '1 month'::interval)::timestamp THEN AG.ID END) as LastMonth, 
COUNT(CASE WHEN createddate between (now() - '3 month'::interval)::timestamp AND (now() - '2 month'::interval)::timestamp THEN AG.ID END) as PrevMonth, 
COUNT(CASE WHEN createddate between (now() - '4 month'::interval)::timestamp AND (now() - '3 month'::interval)::timestamp THEN AG.ID END) as PrevMonth2, 
COUNT(CASE WHEN createddate between (now() - '5 month'::interval)::timestamp AND (now() - '4 month'::interval)::timestamp THEN AG.ID END) as PrevMonth3, 
COUNT(CASE WHEN createddate between (now() - '6 month'::interval)::timestamp AND (now() - '5 month'::interval)::timestamp THEN AG.ID END) as PrevMonth4 
FROM a_group AG 

但在6/21,这将返回数据,4/22-5/21等
我想要的数据如下:6/1-6/21(部分本月),5/1-5/31等。

有什么建议吗?我也怀疑我可以在循环中做到这一点,但对语法还不够熟悉。目前,我正在从PostgreSQL Maestro对备份文件进行测试。

谢谢。

回答

5

我认为date_trunc函数可能是你的朋友(见postgres docs)。你会做这样的事我猜测:

select 
COUNT(ID) as Total, 
COUNT(CASE WHEN createddate between date_trunc('month', now()) AND now() THEN AG.ID END) as ThisMonth, 
COUNT(CASE WHEN createddate between date_trunc('month', now()) - interval '1 month' AND date_trunc('month', now()) - interval '1 day' THEN AG.ID END) as LastMonth, 

等等

+0

你钉它,汤姆。这正是我需要的。 – nycdan

+0

我很想把它放到控制循环中,这样我就可以更容易地修改周期数。如果有人愿意获得积分...... :) – nycdan

+1

您可以使用窗口函数来获得所需的结果(请参阅http://www.postgresql.org/docs/current/static/tutorial-window.html )。例如:SELECT DISTINCT date_trunc('month',createddate)as start,count()OVER(PARTITION BY date_trunc('month',createddate))FROM a_group; – Tom

相关问题