PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Agrégation de données avec OVER PARTITION par date

La requête d'origine fournit déjà les détails de base par jour pour chaque utilisateur. Inutile de ressasser ce calcul. Enveloppez simplement la requête dans un terme CTE.

Voici les colonnes produites par la requête d'origine :

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

Ce que vous voulez faire avec pourcentage n'est pas clair. Je ne pense pas qu'il soit facile d'en agréger un, si vous vous souvenez de ce que cette valeur représente.

Quelque chose comme ça (avec 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
;

Avec résultat de violon :

Cas de test fonctionnel :Cas de test avec PG V3

Mettez à jour votre scénario de test ici :Votre scénario de test est mis à jour