sql >> Databasteknik >  >> RDS >> PostgreSQL

Aggregerar data med OVER PARTITION efter datum

Den ursprungliga frågan ger redan den grundläggande informationen per dag för varje användare. Du behöver inte göra om den beräkningen. Lägg bara in frågan i en CTE-term.

Här är kolumnerna som skapas av den ursprungliga frågan:

| date       | profit | user_id | amount | percent | total_inv | user_profit |

Det är inte klart vad du vill göra med procent. Jag tror inte att man lätt kan aggregera en om man kommer ihåg vad det värdet representerar.

Något så här (med 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
;

Med resultat från fiol:

Fungerande testfall:Testfall med PG V3

Uppdaterade ditt testfall här:Ditt testfall uppdaterat




  1. Mysql DB-tabellrader försvinner

  2. Rails SQL-fråga på okänt (dynamiskt) antal frågor som använder LIKE

  3. Vad är rätt syntax för IF-satsen i MySQL?

  4. Generera sekvens av datum som används i för loop