Pierwotne zapytanie zawiera już podstawowe szczegóły na dzień dla każdego użytkownika. Nie ma potrzeby powtarzania tej kalkulacji. Po prostu zapakuj zapytanie w termin CTE.
Oto kolumny utworzone przez oryginalne zapytanie:
| date | profit | user_id | amount | percent | total_inv | user_profit |
Nie jest jasne, co chcesz zrobić z procentami. Nie sądzę, aby można było łatwo agregować, jeśli pamiętasz, co reprezentuje ta wartość.
Coś takiego (z 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
;
Z wynikiem ze skrzypiec:
Działający przypadek testowy:Przypadek testowy z PG V3
Zaktualizuj swój przypadek testowy tutaj:Twój przypadek testowy został zaktualizowany