PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tổng hợp dữ liệu với OVER PARTITION theo ngày

Truy vấn ban đầu đã cung cấp thông tin chi tiết cơ bản mỗi ngày cho từng người dùng. Không cần phải thực hiện lại phép tính đó. Chỉ cần gói truy vấn trong một thuật ngữ CTE.

Dưới đây là các cột được tạo bởi truy vấn ban đầu:

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

Không rõ bạn muốn làm gì với phần trăm. Tôi không nghĩ rằng một giá trị có thể được tổng hợp dễ dàng, nếu bạn nhớ giá trị đó đại diện cho điều gì.

Một cái gì đó như thế này (với 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
;

Với kết quả từ fiddle:

Trường hợp thử nghiệm đang hoạt động: Trường hợp thử nghiệm với PG V3

Đã cập nhật trường hợp thử nghiệm của bạn tại đây: Trường hợp thử nghiệm của bạn đã được cập nhật




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CHỌN hoặc CHÈN một hàng trong một lệnh

  2. Chú thích ngủ đông cho kiểu nối tiếp PostgreSQL

  3. Postgres CHỌN * TỪ bảng WHERE column-varchar ==string-example?

  4. Truy vấn postgres để kiểm tra một chuỗi có phải là một số không

  5. Cơ sở dữ liệu postgres đang chạy trong docker vẫn bị treo