Die ursprüngliche Abfrage liefert bereits die grundlegenden Details pro Tag für jeden Benutzer. Diese Berechnung muss nicht wiederholt werden. Schließen Sie die Abfrage einfach in einen CTE-Begriff ein.
Hier sind die Spalten, die von der ursprünglichen Abfrage erzeugt wurden:
| date | profit | user_id | amount | percent | total_inv | user_profit |
Es ist nicht klar, was Sie mit Prozent machen wollen. Ich glaube nicht, dass man einen einfach aggregieren kann, wenn Sie sich daran erinnern, was dieser Wert darstellt.
Etwa so (mit 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
;
Mit Ergebnis von fiddle:
Funktionierender Testfall:Testfall mit PG V3
Aktualisierte Ihren Testfall hier:Ihr Testfall wurde aktualisiert