SELECT ts, a, b, c
, COALESCE(max(a) OVER (PARTITION BY grp_a), 0)
+ COALESCE(max(b) OVER (PARTITION BY grp_b), 0)
+ COALESCE(max(c) OVER (PARTITION BY grp_c), 0) AS special_sum
FROM (
SELECT *
,count(a) OVER w AS grp_a
,count(b) OVER w AS grp_b
,count(c) OVER w AS grp_c
FROM t
WINDOW w AS (ORDER BY ts)
) sub
ORDER BY ts;
まず、実際の値を入力し、次のNULL
集約ウィンドウ関数count()
を持つグループ内の値 :NULL
では増加しません 値。
次に、max()
を取得します すべてのグループから、あなたが探しているものに到達します。この時点で、min()
を使用することもできます。 またはsum()
、グループごとにnull以外の値が1つしかないため。
COALESCE()
NULL
をキャッチします 時間の最初の値全体がNULL
の場合の値 。
ts
をどのように選んだかに注意してください time
のような基本タイプ名を使用しないため、列名として 識別子として。
テストケース
そもそも、これがサンプルデータを提供する方法でもあります。
CREATE TEMP TABLE t (ts int, a int, b int, c int);
INSERT INTO t VALUES
(1, 11, 21, NULL)
,(2, 12, 22, NULL)
,(3, 13, NULL, NULL)
,(4, NULL, 23, 32);