sql >> Databáze >  >> RDS >> PostgreSQL

Agregace dat s OVER PARTITION podle data

Původní dotaz již poskytuje základní podrobnosti za den pro každého uživatele. Není třeba opakovat tento výpočet. Stačí zabalit dotaz do výrazu CTE.

Zde jsou sloupce vytvořené původním dotazem:

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

Není jasné, co chcete dělat s procenty. Nemyslím si, že je lze snadno agregovat, pokud si pamatujete, co tato hodnota představuje.

Něco takového (s 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
;

S výsledkem z houslí:

Funkční testovací případ:Testovací případ s PG V3

Váš testovací případ byl aktualizován zde:Váš testovací případ byl aktualizován




  1. vypočítat běžeckou rovnováhu v dotazu Oracle

  2. Vytvoření clusteru Docker Swarm Cluster ve službě Azure Container Service

  3. Jak přistupovat ke vzdálené databázi MySql z aplikace pro iPhone

  4. Najděte název odkazované tabulky pomocí názvu tabulky, pole a schématu