Tidak tahu, jika saya mendapatkan ini dengan benar...
Pertama-tama tampaknya ada kesalahan yang agak jelas di sini:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
Bukankah ini seharusnya:
WHEN t.bucket >90 THEN 'NULL'
Fungsi NTILE
akan menyebarkan set Anda ke dalam ember yang agak rata. Periksa output saya dan temukan bagaimana perilaku ini di kasus sudut. Saya sarankan untuk menggunakan persentase yang dihitung per baris seperti di sini:
WITH tally
(vals, bucket)
AS
(
SELECT
DATEADD(DAY, - ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), GETDATE())
,NTILE(100) OVER (ORDER BY (SELECT NULL))
FROM
(
VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS a(n)
CROSS JOIN (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS b(n)
CROSS JOIN (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0)) AS c(n)
)
SELECT *
INTO #tmpBuckets
FROM Tally;
--Saya menggunakan #tmpBuckets-table ini untuk lebih dekat dengan Saya punya meja skenario
WITH Numbered AS
(
SELECT *
,ROW_NUMBER() OVER(ORDER BY vals DESC) / ((SELECT COUNT(*) FROM #tmpBuckets)/100.0) AS RunningPercentage
FROM #tmpBuckets
)
,ComputeBuckets AS
(
SELECT
t.*
, CASE
WHEN t.RunningPercentage <= 35 THEN 'a'
WHEN t.RunningPercentage > 35 AND t.RunningPercentage <=60 THEN 'b'
WHEN t.RunningPercentage > 60 AND t.RunningPercentage <=90 THEN 'c'
WHEN t.RunningPercentage >90 THEN 'NULL'
END AS ShnugoMethod
, CASE
WHEN t.bucket <= 35 THEN 'a'
WHEN t.bucket > 35 AND t.RunningPercentage <=60 THEN 'b'
WHEN t.bucket > 60 AND t.RunningPercentage <=90 THEN 'c'
WHEN t.bucket > 90 THEN 'NULL'
END AS ZikatoMethod
FROM Numbered t
)
SELECT cb.*
FROM ComputeBuckets cb
ORDER BY cb.vals DESC
GO
DROP TABLE #tmpBuckets;
Saya pikir Anda tahu, cara menggunakan cte seperti itu untuk memperbarui tabel sumber. Jika tidak, kembali saja dengan pertanyaan lain :-)