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