Saya mencoba memigrasikan kueri dari Oracle ke SQL Server 2014.
Inilah permintaan saya yang sangat bagus di Oracle:
select
count(distinct A) over (partition by B) / count(*) over() as A_B
from MyTable
Berikut adalah kesalahan yang saya dapatkan setelah mencoba menjalankan kueri ini di SQL Server 2014.
Use of DISTINCT is not allowed with the OVER clause
Adakah yang tahu apa masalahnya? Apakah mungkin ada semacam query di SQL Server? Mohon saran.
MyTable
? Atau cukupkah baris yang berbeda? Dan Anda tidak perlu mempertimbangkan pembagian dengan kesalahan nol jika tidak ada barisMyTable
?Jawaban:
Tidak, saat ini tidak diterapkan. Lihat permintaan item terhubung berikut.
OVER permintaan peningkatan klausa - DISTINCT klausa untuk fungsi agregat
Varian lain yang mungkin adalah
para pemain
NUMERIC
ada di sana untuk menghindari pembagian bilangan bulat. Alasan untuk klausa gabungan dijelaskan di sini .Itu dapat diganti dengan
ON M.B = T.B OR (M.B IS NULL AND T.B IS NULL)
jika disukai (atau hanyaON M.B = T.B
jikaB
kolom tidak dapat dibatalkan).sumber
Ini memberikan hitungan berbeda (*) untuk A yang dipartisi oleh B:
sumber
A
hanya non-nullable (karena saya pikir itu juga menghitung nulls).abs(dense_rank - dense_rank) + 1
saya percaya.Anda dapat mengambil nilai maks
dense_rank()
untuk mendapatkan hitungan berbeda dari A yang dipartisi oleh B.Untuk menangani kasus di mana A dapat memiliki nilai nol yang dapat Anda gunakan
first_value
untuk mencari tahu apakah nol ada di partisi atau tidak dan kemudian kurangi 1 jika seperti yang disarankan oleh Martin Smith dalam komentar.sumber
Coba lakukan subquery, pengelompokan berdasarkan A, B, dan termasuk hitungan. Kemudian dalam kueri luar Anda, jumlah Anda (berbeda) menjadi jumlah reguler, dan jumlah Anda (*) menjadi jumlah (cnt).
sumber