sql >> Base de Datos >  >> RDS >> PostgreSQL

Agregando datos con OVER PARTITION por fecha

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ó