1

いくつかの日付列に基づいて分析しようとしている Postgres テーブルがあります。

私は基本的に、この要件を満たすテーブル内の行数を数え、月と年でグループ化しようとしています。私のクエリの代わりに、次のようになります。

SELECT * FROM $TABLE WHERE date1::date <= '2012-05-31' 
                       and date2::date > '2012-05-31';

新しいデータを追加するたびに月を手動で変更する必要がないように、データで利用可能な月についてこれを表示できるはずです。そのため、1 つのクエリですべてを取得できます。

上記の例では、基準に適合する行の合計を 2012 年と 05 月にグループ化したいと考えています。同様に、WHERE 句が次のようになっているとします。

date1::date <= '2012-06-31' and date2::date > '2012-06-31'

この合計を 2012 年と 06 月にグループ化したいと思います。

4

3 に答える 3

1

これは私には完全には明らかではありません:

行の合計をグループ化したい

私はそれをこのように解釈します: 条件に一致する「月ごと」のすべての行をリストしたい:

WITH x AS (
    SELECT date_trunc('month', min(date1)) AS start
          ,date_trunc('month', max(date2)) + interval '1 month' AS stop
    FROM   tbl
   )
SELECT to_char(y.mon, 'YYYY-MM') AS mon, t.*
FROM  (
   SELECT generate_series(x.start, x.stop, '1 month') AS mon
   FROM   x
   ) y
LEFT   JOIN tbl t ON t.date1::date <= y.mon 
                 AND t.date2::date >  y.mon   -- why the explicit cast to date?
ORDER  BY y.mon, t.date1, t.date2;

仮定しdate2 >= date1ます。

  1. 期間の下枠と上枠を計算し、月に切り捨てます (最後の行も含めるために、上枠に 1 を追加します。

  2. generate_series()問題の月のセットを作成するために使用します

  3. LEFT JOIN宣言された基準を使用してテーブルから行を抽出し、月ごとに並べ替えます。

GROUP BYこの段階で集計を計算することもできます..

于 2012-08-29T08:01:01.133 に答える
0

これが理由です。まず、すべての可能な日付のリストを作成します。次に、特定の日付までの date1 の累積数を取得します。次に、日付の後の date2 の累積数を取得し、結果を減算します。次のクエリは、相関サブクエリを使用してこれを行います (私のお気に入りの構成ではありませんが、この場合は便利です)。

select thedate,
       (select count(*) from t where date1::date <= d.thedate) -
       (select count(*) from t where date2::date > d.thedate)
from (select distinct thedate
      from ((select date1::date as thedate from t) union all
            (select date2::date as thedate from t)
           ) d
     ) d

これは、date2 が date1 の後に発生することを前提としています。私のモデルは、顧客の開始日と終了日です。そうでない場合、クエリが機能しない可能性があります。

于 2012-08-27T16:05:31.417 に答える
-1

DATEPART T-SQL メソッドの恩恵を受けることができるようです。私があなたを正しく理解していれば、次のようなことができます:

SELECT DATEPART(year, date1) Year, DATEPART(month, date1) Month, SUM(value_col)
FROM $Table
-- WHERE CLAUSE ?
GROUP BY DATEPART(year, date1),
  DATEPART(month, date1)
于 2012-08-27T16:03:09.947 に答える