sql >> Databasteknik >  >> Database Tools >> SSMS

Dela upp setet i ojämna procentsatser

Vet inte, om jag förstår det här rätt...

Först av allt verkar det finnas ett ganska uppenbart misstag här:

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

Borde inte detta vara detta:

    WHEN t.bucket >90 THEN 'NULL'

Funktionen NTILE kommer att sprida dina set i ganska jämna hinkar. Kolla min utdata och se hur detta beter sig i hörnfodral. Jag föreslår att du använder en beräknad procentandel per rad som här:

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;

--Jag använder den här #tmpBuckets-tabellen för att komma närmare din Jag har ett bord 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;

Jag tror att du vet hur man använder en sådan cte för att uppdatera källtabellen. Annars är det bara att återkomma med en annan fråga :-)




  1. Skapa vy utan SUPER-privilegier i phpMyAdmin

  2. XML-utgång trunkeras i SQL

  3. Slår ihop två SQL-frågor

  4. SQL Azure:SMO-undantag vid skriptning av objekt i SSMS 2008 R2