Weet niet of ik het goed begrijp...
Allereerst lijkt er hier een nogal voor de hand liggende fout te zijn:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
Zou dit niet dit moeten zijn:
WHEN t.bucket >90 THEN 'NULL'
De functie NTILE
zal je sets in vrij gelijkmatige emmers verdelen. Controleer mijn output en ontdek hoe dit zich gedraagt in de hoekgevallen. Ik stel voor om een berekend percentage per rij te gebruiken, zoals hier:
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;
--Ik gebruik deze #tmpBuckets-table om dichter bij je Ik heb een tafel te komen scenario
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;
Ik denk dat je weet hoe je zo'n cte moet gebruiken om de brontabel bij te werken. Kom anders gewoon terug met een andere vraag :-)