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

SQL để tạo ảnh chụp nhanh định kỳ từ bảng giao dịch

Được rồi, điều này sẽ khó giải thích.

Vào mỗi ngày cho mỗi trạng thái, bạn nên đếm hai giá trị:

  • Số lượng khách hàng bắt đầu với trạng thái đó.
  • Số lượng khách hàng rời đi với trạng thái đó.

Giá trị đầu tiên là dễ dàng. Nó chỉ là tổng hợp các giao dịch theo ngày tháng và trạng thái.

Giá trị thứ hai là gần như dễ dàng. Bạn nhận được trước đó mã trạng thái và đếm số lần mã trạng thái đó "rời khỏi" vào ngày đó.

Sau đó, khóa là tổng tích lũy của giá trị đầu tiên trừ đi tổng tích lũy của giá trị thứ hai.

Tôi tự do thừa nhận rằng đoạn mã sau không được kiểm tra (nếu bạn có SQL Fiddle, tôi rất vui được kiểm tra nó). Nhưng đây là kết quả truy vấn trông như thế nào:

select status_dte, status_cd,
       (sum(inc_cnt) over (partition by status_cd order by status_dt) -
        sum(dec_cnt) over (partition by status_cd order by status_dt)
       ) as dateamount
from ((select t.status_dt, t.status_cd, count(*) as inc_cnt, 0 as dec_cnt
       from transactions t
       group by t.status_dt, t.status_cd 
      ) union all
      (select t.status_dt, prev_status_cd, 0, count(*)
       from (select t.*
                    lag(t.status_cd) over (partition by t.account_id order by status_dt) as prev_status_cd
             from transactions t
            ) t
       where prev_status_cd is null
       group by t.status_dt, prev_status_cd
      ) 
     ) t;

Nếu bạn có những ngày không có thay đổi cho một hoặc nhiều trạng thái bạn muốn bao gồm những thứ đó trong đầu ra, thì truy vấn trên sẽ cần sử dụng cross join để đầu tiên tạo các hàng trong tập kết quả. Không rõ đây có phải là một yêu cầu hay không, vì vậy tôi sẽ loại bỏ sự phức tạp đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. thả không gian bảng nếu không tồn tại

  2. Ngày của Javascript thành đối tượng ngày sql

  3. Tạo ngày giữa hai ngày

  4. Làm thế nào để triển khai trình kích hoạt này trên Oracle SQL?

  5. ResultSet.getString (Ngày) khác nhau dựa trên trình điều khiển