2011-06-21 12 views
1

私は、作成した日付のレコードのテーブルを持っています。今月の部分を含め、過去6カ月ごとに新しいレコードを返信したいと思います。私はSQL Serverをよく知っていますが、PostgreSQLに精通していません。私はこのクエリと転がりヶ月のデータを取得することができたPostgreSQLで過去nヶ月間の新しいレコードを検索

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、5/22-6/21からのデータを返します。 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)をstart、count()で区切ります(PARTITION BY date_trunc( 'month'、createddate))FROM a_group; – Tom

関連する問題