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

2行の差または比率を順番に取得する集計関数

    there are only two rows per price 、これは多くになる可能性があります よりシンプルで高速:

    SELECT n.item, n.price - o.price AS diff, n.price / o.price AS ratio
    FROM   price n                 -- "new"
    JOIN   price o USING (item)    -- "old"
    WHERE  n.day > o.day;
    

    -> SQLfiddle

    このフォームには、両方の行のすべての列を直接使用できるという追加の利点があります。

    より複雑なシナリオの場合 (これには必要ありません)、指摘されているようにウィンドウ関数を使用できます。提案されているものよりも簡単なアプローチは次のとおりです。

    SELECT DISTINCT ON (item)
           item
          ,price - lead(price) OVER (PARTITION BY item ORDER BY day DESC) AS diff
    FROM   price
    ORDER  BY item, day DESC;
    

    ここで必要なウィンドウ関数は1つだけです。 DISTINCT ON に適用されます ウィンドウ関数。ウィンドウ内の並べ替え順序は全体的な並べ替え順序と一致し、パフォーマンスを向上させます。



    1. OracleJDBCのストアドプロシージャで定義されたINOUTCLOBパラメータを使用するにはどうすればよいですか?

    2. ORDER BY および UNION を使用した ORACLE クエリ

    3. Postgres:varcharをテキストに変換する

    4. OBJECTPROPERTY()を使用して、SQLServerのテーブルにTIMESTAMP列があるかどうかを確認します。