declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
pilih di atas mengembalikan saya yang berikut.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Bagaimana saya mendapatkan yang berikut ini:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Jawaban:
Contoh SQL Fiddle
Keluaran
Sunting: ini adalah solusi umum yang akan bekerja di sebagian besar platform db. Ketika ada solusi yang lebih baik tersedia untuk platform spesifik Anda (misalnya, Gareth's), gunakan!
sumber
Versi terbaru dari SQL Server (2012) memungkinkan yang berikut ini.
atau
Ini bahkan lebih cepat. Versi yang dipartisi selesai dalam 34 detik lebih dari 5 juta baris untuk saya.
Terima kasih kepada Peso, yang mengomentari utas Tim SQL yang disebut dalam jawaban lain.
sumber
ROWS UNBOUNDED PRECEDING
bukanROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. Tidak segera jelas bagi saya jika itu akan berhasil tetapi itu berhasil :-)Untuk SQL Server 2012 dan seterusnya, bisa mudah:
karena
ORDER BY
klausa untukSUM
secara default berartiRANGE UNBOUNDED PRECEDING AND CURRENT ROW
untuk bingkai jendela ("Keterangan Umum" di https://msdn.microsoft.com/en-us/library/ms189461.aspx )sumber
Versi CTE, hanya untuk bersenang-senang:
Pengembalian:
sumber
Mari kita pertama-tama membuat tabel dengan data dummy ->
di sini saya bergabung dengan tabel yang sama (SELF Joining)
HASIL:
di sini kita pergi sekarang jumlah saja Nilai t2 dan kita akan mendapatkan ans
Hasil yang diinginkan
Bersihkan dummytable
sumber
rank()
perintah lain dan klausa untuk menyelesaikannya.Jawaban terlambat tetapi menunjukkan satu kemungkinan lagi ...
Jumlah kumulatif jumlah dapat lebih dioptimalkan dengan
CROSS APPLY
logika.Bekerja lebih baik daripada
INNER JOIN
&OVER Clause
saat dianalisis rencana kueri yang sebenarnya ...sumber
set io statistics on
dan bandingkan cpu dan waktu sebenarnya.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
sumber
correlated subquery
untuk setiap baris dari set hasil, memindai lebih banyak dan lebih banyak baris saat berjalan. Itu tidak menjaga total berjalan dan memindai data sekali seperti fungsi jendela bisa.Ada implementasi CTE yang jauh lebih cepat tersedia di pos yang sangat baik ini: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
Masalah di utas ini dapat dinyatakan seperti ini:
sumber
Anda dapat menggunakan permintaan sederhana ini untuk perhitungan progresif:
sumber
Setelah tabel dibuat -
sumber
Di atas (Pra-SQL12) kita melihat contoh seperti ini: -
Lebih efisien...
sumber
Coba ini
sumber
Coba ini:
sumber
Solusi SQL yang menggabungkan "BARIS ANTARA KETEPATAN YANG TIDAK DIUNDING DAN BARIS SAAT INI" dan "SUM" melakukan apa yang ingin saya capai. Terima kasih banyak!
Jika itu dapat membantu siapa pun, ini kasus saya. Saya ingin mengumpulkan +1 di kolom setiap kali pembuat ditemukan sebagai "Pembuat Beberapa" (contoh). Jika tidak, tidak ada kenaikan tetapi tampilkan hasil kenaikan sebelumnya.
Jadi ini bagian dari SQL:
Izinkan saya untuk mendapatkan sesuatu seperti ini:
Penjelasan di atas: Ini memulai hitungan "beberapa pembuat" dengan 0, Beberapa Pembuat ditemukan dan kami melakukan +1. Untuk Pengguna 1, MakerC ditemukan sehingga kami tidak melakukan +1 tetapi hitungan vertikal Beberapa Pembuat terjebak ke 2 sampai baris berikutnya. Partisi adalah oleh Pengguna sehingga ketika kami mengubah pengguna, jumlah kumulatif kembali ke nol.
Saya di tempat kerja, saya tidak ingin mendapat jawaban apa pun, hanya ucapkan terima kasih dan tunjukkan contoh saya jika seseorang ada dalam situasi yang sama. Saya mencoba untuk menggabungkan SUM dan PARTITION tetapi sintaks yang menakjubkan "BARIS ANTARA PENGECUALIAN YANG TIDAK DITINGGALKAN DAN BARANG LANCAR" menyelesaikan tugas.
Terima kasih! Groaker
sumber
Tanpa menggunakan segala jenis gaji kumulatif BERGABUNG untuk seseorang yang diambil dengan menggunakan kueri ikuti:
sumber
Untuk Contoh: JIKA Anda memiliki tabel dengan dua kolom, satu adalah ID dan yang kedua adalah angka dan ingin mengetahui jumlah kumulatif.
sumber