Không biết, nếu tôi hiểu đúng ...
Trước hết, dường như có một sai lầm khá rõ ràng ở đây:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
Không nên thế này:
WHEN t.bucket >90 THEN 'NULL'
Hàm NTILE
sẽ dàn trải các bộ của bạn thành các nhóm khá đồng đều. Kiểm tra đầu ra của tôi và tìm cách hoạt động của điều này trong các trường hợp góc. Tôi khuyên bạn nên sử dụng tỷ lệ phần trăm được tính toán trên mỗi hàng như sau:
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;
--Tôi sử dụng # tmpBuckets-table này để đến gần hơn với Tôi có một cái bàn của bạn kịch bản
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;
Tôi nghĩ rằng bạn biết, làm thế nào để sử dụng một cte như vậy để cập nhật bảng nguồn. Nếu không, chỉ cần quay lại với một câu hỏi khác :-)