PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aggregieren von Daten mit OVER PARTITION nach Datum

Die ursprüngliche Abfrage liefert bereits die grundlegenden Details pro Tag für jeden Benutzer. Diese Berechnung muss nicht wiederholt werden. Schließen Sie die Abfrage einfach in einen CTE-Begriff ein.

Hier sind die Spalten, die von der ursprünglichen Abfrage erzeugt wurden:

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

Es ist nicht klar, was Sie mit Prozent machen wollen. Ich glaube nicht, dass man einen einfach aggregieren kann, wenn Sie sich daran erinnern, was dieser Wert darstellt.

Etwa so (mit 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
;

Mit Ergebnis von fiddle:

Funktionierender Testfall:Testfall mit PG V3

Aktualisierte Ihren Testfall hier:Ihr Testfall wurde aktualisiert