Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Fungsi Jendela - Menjalankan Total dengan reset

Ini dapat dilakukan dengan menggunakan solusi berbasis himpunan:

1.Hitung total berjalan normal (sebut saja RT)

2.Hitung running minimum RT (sebut saja MN)

Ketika MN negatif, -MN adalah jumlah total yang harus Anda isi ulang sejauh ini. Biarkan isi_rt menjadi -MN ketika MN negatif. Jadi, total running baru (sebut saja new_rt) adalah rt + recharge_rt. Dan jika Anda perlu mengembalikan jumlah pengisian saat ini yang diperlukan, kurangi pengisian_rt sebelumnya (menggunakan LAG) dari arus.

Inilah kueri solusi lengkapnya:

with c1 as
(
  select *,
    sum(qty) over(order by tdate rows unbounded preceding) as rt
  from tx
),
c2 as
(
  select *,
    -- when negative, mn is the total qty that had to be
    -- replenished until now, inclusive
    min(rt) over(order by tdate rows unbounded preceding) as mn_cur
  from c1
)
select tdate, qty, rt,
  replenish_rt - lag(replenish_rt, 1, 0) over(order by tdate) as replenish,
  rt + replenish_rt as new_rt
from c2
  cross apply(values(case when mn_cur < 0 then -mn_cur else 0 end)) as a1(replenish_rt);
Semangat, Itzik

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah praktik buruk NOLOCK (Petunjuk Sql Server)?

  2. DATEDIFF() Contoh di SQL Server

  3. Dapatkan daftar database dari SQL Server

  4. Cara Tercepat untuk Menemukan Fitur Usang yang Masih Digunakan di Instance SQL Server (Contoh T-SQL)

  5. Mengakses langsung Sql Server Database di Xamarin.Forms