SSMS
 sql >> Datenbank >  >> Database Tools >> SSMS

Teilen Sie den Satz in ungerade prozentuale Eimer auf

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 :-)