La consulta original ya proporciona el detalle básico por día para cada usuario. No hay necesidad de repetir ese cálculo. Simplemente envuelva la consulta en un término CTE.
Aquí están las columnas producidas por la consulta original:
| date | profit | user_id | amount | percent | total_inv | user_profit |
No está claro qué quiere hacer con el porcentaje. No creo que uno pueda agregarse fácilmente, si recuerda lo que representa ese valor.
Algo como esto (con 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
;
Con resultado de violín:
Caso de prueba en funcionamiento:Caso de prueba con PG V3
Actualicé su caso de prueba aquí:Su caso de prueba se actualizó