Nie wiem, czy dobrze rozumiem...
Przede wszystkim wydaje się, że jest tu dość oczywisty błąd:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
Czy nie powinno tak być:
WHEN t.bucket >90 THEN 'NULL'
Funkcja NTILE
rozłoży twoje zestawy na dość równe wiadra. Sprawdź moje wyniki i dowiedz się, jak to się zachowuje w narożnych przypadkach. Proponuję użyć obliczonego procentu na wiersz, jak tutaj:
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;
--Używam tego #tmpBuckets-tabeli, aby zbliżyć się do Twojego Mam stół scenariusz
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;
Myślę, że wiesz, jak wykorzystać takie cte do aktualizacji tabeli źródłowej. W przeciwnym razie po prostu wróć z kolejnym pytaniem :-)