2016-12-16 3 views
0

今日このトピック(link)に関する私の最初の質問によれば、さらに私を贈ります。 私は次のSQL結果を持っています:年、四半期、月、週、および価値のあるx値。現在、私は月に1〜4の数字を挙げています。しかし、私は現在、最大52の連続した数字と1ヶ月間の4つだけを使いたいと思っています。次の結果から、あるPostgresql:4行の行を連続した数字で区切ってください

year | quarter | month | week | value 
2016 | 1  | 1  | 1 | 19738,5 
2016 | 1  | 1  | 2 | 19738,5 
2016 | 1  | 1  | 3 | 19738,5 
2016 | 1  | 1  | 4 | 19738,5 

が、これはなるはずですので

year | quarter | month | week | value 
2016 | 1  | 1  | 1 | 19738,5 
2016 | 1  | 1  | 2 | 19738,5 
2016 | 1  | 1  | 3 | 19738,5 
2016 | 1  | 1  | 4 | 19738,5 
2016 | 1  | 2  | 5 | 19738,5 
2016 | 1  | 2  | 6 | 19738,5 
2016 | 1  | 2  | 7 | 19738,5 
2016 | 1  | 2  | 8 | 19738,5 

祖diesem Zeitpunkt lautet死ぬ問合せ:また

SELECT a.year, a.quarter, a.month, b.week AS week, sum(a.points) AS value 
FROM 
    TABLE AS a, 
    (SELECT UNNEST(ARRAY[1, 2, 3, 4]) as week) AS b 
GROUP BY 
    year, 
    quarter, 
    month, 
    week; 

、私は残念ながら持っていますあなたの助けのためのアイデアや希望はありません。

+1

質問を編集して質問に含める必要があります。 –

+1

ほとんどの月は30日または31日(<> 4週間)です。 – jarlh

+0

@ GordonLinoff質問を追加しました – Lars

答えて

0

私が理解する限り、あなたは月ごとに12のレコードを持っています。月、四半期、週を抽出する日時はありません。

私は前の回答を週番号としてrow_number()を追加して変更しました。

ことに留意してください:

これは、それは単に4で毎月分割し、これは48週年を意味し、実際の週数

ではありません。

select year, month, quarter, 
      row_number() over (partition by year order by year,month,quarter) as week, 
      value/4 as week_value 
    from t1, 
     (SELECT UNNEST(ARRAY[1, 2, 3, 4])) b; 

ここでそれを確認してください:http://rextester.com/XUQRK94308

+0

ありがとうございます私は何が必要です。私はこれが実際の週番号ではないことを知っています。私はその問題の解決策を見つけることを願っていますが、現時点ではこれは大丈夫です。ありがとう – Lars

0

は、あなたが実行して、月に実行されている週を接合することができます - 週は2月、それがもしそうなら、あなたはJOINをすることができます2月、それは月に終わる関係なく、に属しているに開始した場合ここのように:

t=# select 
    wom "week of month", mn "month", wn "week", amount/max(wom) over(partition by mn) 
from (
with 
    weeks as (select generate_series('2016-01-01'::date,'2017-01-01'::date,'1 week'::interval) w) 
, months as (select generate_series('2016-01-01'::date,'2017-01-01'::date,'1 month'::interval) m) 
select *, 78954 amount, dense_rank() over (partition by m order by w) wom, dense_rank() over (order by m) mn, dense_rank() over (order by w) wn 
from weeks 
join months on date_trunc('month',w) = m 
) p 
; 
week of month | month | week | ?column? 
---------------+-------+------+---------- 
      1 |  1 | 1 | 15790 
      2 |  1 | 2 | 15790 
      3 |  1 | 3 | 15790 
      4 |  1 | 4 | 15790 
      5 |  1 | 5 | 15790 
      1 |  2 | 6 | 19738 
      2 |  2 | 7 | 19738 
      3 |  2 | 8 | 19738 
      4 |  2 | 9 | 19738 
      1 |  3 | 10 | 19738 
      2 |  3 | 11 | 19738 
      3 |  3 | 12 | 19738 
      4 |  3 | 13 | 19738 
      1 |  4 | 14 | 15790 
      2 |  4 | 15 | 15790 
      3 |  4 | 16 | 15790 
      4 |  4 | 17 | 15790 
      5 |  4 | 18 | 15790 
      1 |  5 | 19 | 19738 
      2 |  5 | 20 | 19738 
      3 |  5 | 21 | 19738 
      4 |  5 | 22 | 19738 
      1 |  6 | 23 | 19738 
      2 |  6 | 24 | 19738 
      3 |  6 | 25 | 19738 
      4 |  6 | 26 | 19738 
      1 |  7 | 27 | 15790 
      2 |  7 | 28 | 15790 
      3 |  7 | 29 | 15790 
      4 |  7 | 30 | 15790 
      5 |  7 | 31 | 15790 
      1 |  8 | 32 | 19738 
      2 |  8 | 33 | 19738 
      3 |  8 | 34 | 19738 
      4 |  8 | 35 | 19738 
      1 |  9 | 36 | 15790 
      2 |  9 | 37 | 15790 
      3 |  9 | 38 | 15790 
      4 |  9 | 39 | 15790 
      5 |  9 | 40 | 15790 
      1 | 10 | 41 | 19738 
      2 | 10 | 42 | 19738 
      3 | 10 | 43 | 19738 
      4 | 10 | 44 | 19738 
      1 | 11 | 45 | 19738 
      2 | 11 | 46 | 19738 
      3 | 11 | 47 | 19738 
      4 | 11 | 48 | 19738 
      1 | 12 | 49 | 15790 
      2 | 12 | 50 | 15790 
      3 | 12 | 51 | 15790 
      4 | 12 | 52 | 15790 
      5 | 12 | 53 | 15790 
(53 rows)