PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggregazione dei dati con OVER PARTITION per data

La query originale fornisce già i dettagli di base giornalieri per ciascun utente. Non c'è bisogno di ripetere quel calcolo. Basta racchiudere la query in un termine CTE.

Ecco le colonne prodotte dalla query originale:

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

Non è chiaro cosa vuoi fare con la percentuale. Non credo che uno possa essere aggregato facilmente, se ricordi cosa rappresenta quel valore.

Qualcosa del genere (con 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
;

Con risultato da violino:

Test case funzionante:Test case con PG V3

Aggiornato il tuo test case qui:Il tuo test case aggiornato