PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Agregacja danych z OVER PARTITION według daty

Pierwotne zapytanie zawiera już podstawowe szczegóły na dzień dla każdego użytkownika. Nie ma potrzeby powtarzania tej kalkulacji. Po prostu zapakuj zapytanie w termin CTE.

Oto kolumny utworzone przez oryginalne zapytanie:

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

Nie jest jasne, co chcesz zrobić z procentami. Nie sądzę, aby można było łatwo agregować, jeśli pamiętasz, co reprezentuje ta wartość.

Coś takiego (z 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
;

Z wynikiem ze skrzypiec:

Działający przypadek testowy:Przypadek testowy z PG V3

Zaktualizuj swój przypadek testowy tutaj:Twój przypadek testowy został zaktualizowany




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zapisać lub pobrać kolumnę tablicy za pomocą Hibernate?

  2. wyzwalacz postgresql:wyłącz automatyczne zatwierdzanie i ustaw poziom izolacji

  3. Dowiedz się, czy użytkownik ma uprawnienia do wyboru/aktualizacji/... tabeli/funkcji/... w PostgreSQL

  4. narzędzie do porównywania postgres

  5. Jak tworzyć trwałe pliki w Heroku?