PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menggabungkan Data dengan OVER PARTITION berdasarkan tanggal

Kueri asli sudah memberikan detail dasar per hari untuk setiap pengguna. Tidak perlu mengulang perhitungan itu. Cukup bungkus kueri dalam istilah CTE.

Berikut adalah kolom yang dihasilkan oleh kueri asli:

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

Tidak jelas apa yang ingin Anda lakukan dengan persen. Saya tidak berpikir bahwa seseorang dapat dengan mudah digabungkan, jika Anda ingat apa yang diwakili oleh nilai itu.

Sesuatu seperti ini (dengan 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
;

Dengan hasil dari biola:

Kasus uji yang berfungsi:Kasus uji dengan PG V3

Perbarui kasus uji Anda di sini:Kasus uji Anda diperbarui




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mencegah injeksi SQL dengan string kueri JSONB sewenang-wenang yang disediakan oleh klien eksternal?

  2. Otentikasi kata sandi gagal untuk wadah postgres Docker

  3. Cara mengatur sumber data SSL Spring/Heroku/postgres

  4. Bagaimana Now() Bekerja di PostgreSQL

  5. Penerapan dan Pemeliharaan PostgreSQL dengan Ansible