0

ID でパーティション分割し、ユーザーが特定の月までに作成したアイテムの数をカウントする WITH テーブルがあります。

|      ID |  COUNT |   MONTH |
------------------------------
|       1 |      1 | 2013-01 |
|       1 |      2 | 2013-05 |
|       2 |      1 | 2013-02 |
|       2 |      2 | 2013-04 |
|       2 |      3 | 2013-06 |
|       3 |      1 | 2013-01 |  

postgresql では、不足している月にカウントを追加して、このような最終的なクエリ結果を作成するにはどうすればよいですか?

|      ID |  COUNT |   MONTH |
------------------------------
|       1 |      1 | 2013-01 |
|       1 |      1 | 2013-02 |
|       1 |      1 | 2013-03 |
|       1 |      2 | 2013-04 |
|       1 |      2 | 2013-05 |
|       1 |      3 | 2013-06 |
|       2 |      1 | 2013-02 |
|       2 |      1 | 2013-03 |
|       2 |      2 | 2013-04 |
|       2 |      2 | 2013-05 |
|       2 |      3 | 2013-06 |
|       3 |      1 | 2013-01 |  
|       3 |      1 | 2013-02 |  
|       3 |      1 | 2013-03 |
|       3 |      1 | 2013-04 |
|       3 |      1 | 2013-05 |
|       3 |      1 | 2013-06 |
4

2 に答える 2

0

MONTH が何らかの形式のテキスト フィールドであると仮定します。

INSERT INTO myTable (id, "count", month)
SELECT t1.id, t1."count", TO_CHAR(r.d, 'YYYY-MM')
FROM myTable as t1
JOIN (SELECT generate_series((min(month) || '-01')::date, 
                                   date_trunc('month',now())::date, 
                                   '1 month') as d
            FROM myTable) AS r 
  ON (t1.month || '-01')::date < r.d
WHERE NOT EXISTS (
  SELECT 1 FROM myTable as t2
  WHERE t1.id = t2.id 
    AND ( (t1."count" < t2."count" AND (t2.month || '-01')::date <= r.d)
         OR (t1."count" = t2."count" AND (t2.month || '-01')::date = r.d))
);

ここでsqlfiddleを使用しています。

于 2013-06-10T19:21:02.413 に答える