De oorspronkelijke query biedt al het basisdetail per dag voor elke gebruiker. Het is niet nodig om die berekening opnieuw te maken. Wikkel de zoekopdracht gewoon in een CTE-term.
Dit zijn de kolommen geproduceerd door de oorspronkelijke zoekopdracht:
| date | profit | user_id | amount | percent | total_inv | user_profit |
Het is niet duidelijk wat je met procent wilt doen. Ik denk niet dat die gemakkelijk kan worden geaggregeerd, als je je herinnert wat die waarde vertegenwoordigt.
Iets als dit (met 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
;
Met resultaat van viool:
Werkende testcase:Testcase met PG V3
Je testcase hier bijgewerkt:Je testcase bijgewerkt