sql >> データベース >  >> RDS >> PostgreSQL

ウィンドウ関数を使用してパーティション間で合計

    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);
    



    1. microsoft.sqlserver.batchparser.dllが見つかりません

    2. Android Room Database、入力された最新のレコードの特定の値を取得します

    3. PHPでmysqlテーブルをロックする方法

    4. CONNECT BYの標準的な代替手段?