Не знам, ако разбирам правилно...
Преди всичко изглежда, че тук има доста очевидна грешка:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
Това не трябва ли да е това:
WHEN t.bucket >90 THEN 'NULL'
Функцията NTILE
ще разпредели вашите комплекти в доста равномерни кофи. Проверете моя изход и разберете как се държи това в ъглите. Предлагам да използвате изчислен процент на ред като тук:
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;
--Използвам тази #tmpBuckets-table, за да се доближа до вашата Имам маса сценарий
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;
Мисля, че знаете как да използвате такъв cte за актуализиране на таблицата с източник. В противен случай просто се върнете с друг въпрос :-)