「選択内の選択」 より一般的には「サブセレクト」または「サブクエリ」と呼ばれます。特定のケースでは、相関サブクエリです。 。 LATERAL
結合(postgres 9.3の新機能)は、相関サブクエリをより柔軟なソリューションに大幅に置き換えることができます:
ここでも必要ないと思います。
最初のケースの場合 ただし、このクエリはおそらくより高速で単純です。
SELECT date, max(value) OVER (PARTITION BY grp) AS value
FROM (
SELECT *, count(value) OVER (ORDER BY date) AS grp
FROM test_fill_null
) sub;
count()
null以外の値のみをカウントするため、grp
null以外のvalue
ごとにインクリメントされます 、それによって必要に応じてグループを形成します。 1つを選ぶのは簡単です null以外のvalue
grp
ごと 外側のSELECT
。
2番目のケースの場合 、行の最初の順序は(id1, id2, tms)
によって決定されると仮定します クエリの1つで示されているとおりです。
SELECT id1, id2, tms
, count(step) OVER (ORDER BY id1, id2, tms) AS group_id
FROM (
SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
< tms - interval '5 min'
THEN true END AS step
FROM table0
) sub
ORDER BY id1, id2, tms;
実際の注文に合わせてください。これらの1つがそれをカバーするかもしれません:
PARTITION BY id1 ORDER BY id2 -- ignore tms
PARTITION BY id1 ORDER BY tms -- ignore id2
SQLフィドル 拡張された例で。
関連: