SSMS
 sql >> Base de données >  >> Database Tools >> SSMS

Diviser l'ensemble en tranches de pourcentage inégal

Je ne sais pas, si j'ai bien compris...

Tout d'abord, il semble y avoir une erreur plutôt évidente ici :

    WHEN t.bucket > 60 AND t.bucket <=90 THEN 'NULL'

Cela ne devrait-il pas être ceci :

    WHEN t.bucket >90 THEN 'NULL'

La fonction NTILE répartira vos ensembles dans des seaux plutôt uniformes. Vérifiez ma sortie et découvrez comment cela se comporte dans les cas d'angle. Je suggère d'utiliser un pourcentage calculé par ligne comme ici :

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;

--J'utilise cette #tmpBuckets-table pour me rapprocher de votre j'ai une table scénario

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;

Je pense que vous savez comment utiliser un tel cte pour mettre à jour la table source. Sinon reviens avec une autre question :-)