sql >> Database >  >> RDS >> PostgreSQL

Gegevens aggregeren met OVERPARTITIE op datum

De oorspronkelijke query biedt al het basisdetail per dag voor elke gebruiker. Het is niet nodig om die berekening opnieuw te maken. Wikkel de zoekopdracht gewoon in een CTE-term.

Dit zijn de kolommen geproduceerd door de oorspronkelijke zoekopdracht:

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

Het is niet duidelijk wat je met procent wilt doen. Ik denk niet dat die gemakkelijk kan worden geaggregeerd, als je je herinnert wat die waarde vertegenwoordigt.

Iets als dit (met 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
;

Met resultaat van viool:

Werkende testcase:Testcase met PG V3

Je testcase hier bijgewerkt:Je testcase bijgewerkt




  1. Meerdere groepen gebruiken door in één query te hebben

  2. Poging om een ​​reeds gesloten object sqlitedatabase opnieuw te openen

  3. Wizard Entiteitsgegevensmodel crasht met Oracle Connection

  4. Rij verwijderen met een Mysql-trigger