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

日付によるOVERPARTITIONを使用したデータの集約

    元のクエリは、各ユーザーの1日あたりの基本的な詳細をすでに提供しています。その計算を再ハッシュする必要はありません。クエリをCTE用語でラップするだけです。

    元のクエリによって生成された列は次のとおりです。

    | date       | profit | user_id | amount | percent | total_inv | user_profit |
    

    パーセントで何をしたいのか明確ではありません。その値が何を表しているかを覚えていれば、簡単に集計できるとは思いません。

    このようなもの(total_shareを使用):

    WITH query1 AS (
      SELECT s.date, s.profit
           , i.user_id, i.amount, i.percent
           , SUM(i.amount) OVER (PARTITION BY s.date) AS total_inv
           , ROUND(s.profit * (i.percent / 100.0) * i.amount / SUM(i.amount) OVER (PARTITION BY s.date), 2) AS user_profit
           , ROUND((1.0 * i.amount / (SUM(i.amount) over (partition by s.date))) * i.percent, 2) AS user_share
        FROM daily_stats AS s
        JOIN investments AS i
          ON s.date BETWEEN i.start_date AND i.end_date
       WHERE s.date BETWEEN '2021-02-01' AND '2021-02-05'
         )
    SELECT date
         , MAX(profit) AS profit
         , MAX(total_inv) AS total_inv
         , SUM(user_profit) AS total_profit
         , SUM(user_share) AS total_share
      FROM query1
     WHERE user_id IN (1, 4)
     GROUP BY date
    ;
    

    フィドルの結果:

    実用的なテストケース:PGV3を使用したテストケース

    ここでテストケースを更新しました:テストケースを更新しました




    1. EMRの外部ハイブメタストア

    2. 警告:foreach()に無効な引数が指定されました

    3. Oracle SQLを使用して、1つの出力日数と曜日をどのように出力しますか?

    4. 最近のリリースで新しく進化するPostgreSQLエンタープライズ機能