2016-07-30 6 views
0

私は四半期ごとのイベント、四半期のイベントの日付とコストを追跡するpostgresのDBテーブルを持っています。 各イベントには少なくとも5分の4の情報があり、一部のイベントには8分の3以上のイベントがあります。SQLクエリは、日付エントリの行ベースの数値を返します

サンプルテーブル

EventA | 2013-01-01 | 500 EventA | 2013-04-01 | 600 EventA | 2013-07-01 | 700 EventA | 2013-10-01 | 700 EventA | 2014-01-01 | 750 EventB | 2013-01-01 | 400 EventB | 2013-04-01 | 500 EventB | 2013-07-01 | 600 EventB | 2013-10-01 | 600 EventB | 2014-01-01 | 575 EventB | 2014-04-01 | 700 EventB | 2014-07-01 | 750 EventB | 2014-10-01 | 800 EventB | 2015-01-01 | 800 EventB | 2015-04-01 | 840

私は、クエリを経由して次の操作を実行できるようにしたいと思います。イベントの行数が6以下の場合は、第1四半期の行と最後の行を返します。イベントの期間が7分の1以上の場合は、最後の四半期の行(最新の日付)と6分の1を返します。つまり、イベントに3年間の情報、12分の1のイベントがある場合は、第12四半期と第6四半期を見たいと思います。

私はウィンドウ関数を使用して四分の一カウントをイベントごとに返し、サブクエリを使用してイベントの四半期数に基づいて結果を取得する方法を知っています。立ち往生した。私はこれらの結果セットを取って、それらを結合して私の後ろの行を返す必要があると思っていますが、これを行う方法はわかりません。予め

EventA | 2013-01-01 | 500 EventA | 2014-01-01 | 750 EventB | 2013-10-01 | 600 EventB | 2015-04-10 | 840

おかげであろう上記の例から返さ

ように、サンプルデータ

+0

見つからない:Postgresのバージョン、テーブル定義、試したクエリ。 –

答えて

1

例データ:

create table events (event text, quarter date, cost integer); 
insert into events values 

('EventA', '2013-01-01', 500), 
('EventA', '2013-04-01', 600), 
('EventA', '2013-07-01', 700), 
('EventA', '2013-10-01', 700), 
('EventA', '2014-01-01', 750), 
('EventB', '2013-01-01', 400), 
('EventB', '2013-04-01', 500), 
('EventB', '2013-07-01', 600), 
('EventB', '2013-10-01', 600), 
('EventB', '2014-01-01', 575), 
('EventB', '2014-04-01', 700), 
('EventB', '2014-07-01', 750), 
('EventB', '2014-10-01', 800), 
('EventB', '2015-01-01', 800), 
('EventB', '2015-04-01', 840); 

選択:
- 降順で行番号および
- paの行数イベント

と選択によってrtitions:
- パーティション内の最初の行と
- 7又は最後の行以下である数応じ。

select event, quarter, cost 
from (
    select 
     *, 
     row_number() over (partition by event order by quarter desc) rn, 
     count(*) over (partition by event) maxn 
    from events 
    ) s 
where rn = 1 or rn = least(maxn, 7) 
order by 1, 2; 

event | quarter | cost 
--------+------------+------ 
EventA | 2013-01-01 | 500 
EventA | 2014-01-01 | 750 
EventB | 2013-10-01 | 600 
EventB | 2015-04-01 | 840 
(4 rows) 
+0

klinさん、ありがとうございました。私はその解決策がまっすぐ進むとは思わなかった。私はこのクエリを持っていましたが、私は正しいwhere節を持っていませんでした。 – tman

関連する問題