Weiß nicht, ob ich das richtig verstehe...
Zunächst scheint hier ein ziemlich offensichtlicher Fehler vorzuliegen:
WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'
Sollte das nicht das sein:
WHEN t.bucket >90 THEN 'NULL'
Die Funktion NTILE
wird Ihre Sets in ziemlich gleichmäßige Eimer verteilen. Überprüfen Sie meine Ausgabe und finden Sie heraus, wie sich diese in den Eckfällen verhält. Ich schlage vor, einen berechneten Prozentsatz pro Zeile wie hier zu verwenden:
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;
--Ich benutze diese #tmpBuckets-Tabelle, um näher an Ihre Ich habe eine Tabelle heranzukommen Szenario
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;
Ich denke, Sie wissen, wie Sie mit einem solchen CTE die Quelltabelle aktualisieren. Ansonsten komm einfach mit einer anderen Frage zurück :-)