SSMS
 sql >> Baza danych >  >> Database Tools >> SSMS

Podziel zestaw na nierówne procenty wiader

Nie wiem, czy dobrze rozumiem...

Przede wszystkim wydaje się, że jest tu dość oczywisty błąd:

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

Czy nie powinno tak być:

    WHEN t.bucket >90 THEN 'NULL'

Funkcja NTILE rozłoży twoje zestawy na dość równe wiadra. Sprawdź moje wyniki i dowiedz się, jak to się zachowuje w narożnych przypadkach. Proponuję użyć obliczonego procentu na wiersz, jak tutaj:

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;

--Używam tego #tmpBuckets-tabeli, aby zbliżyć się do Twojego Mam stół scenariusz

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;

Myślę, że wiesz, jak wykorzystać takie cte do aktualizacji tabeli źródłowej. W przeciwnym razie po prostu wróć z kolejnym pytaniem :-)




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Konwertuj listę varchar na int w Sql Server

  2. SQL Server ISNUMERIC() Wyjaśnienie

  3. Gdzie mogę sprawdzić typ tabeli definiowanej przez użytkownika w programie SQL Server 2008 w programie SSMS? i jak wstawić do niego nową kolumnę?

  4. mssql „5 (Odmowa dostępu.)” Błąd podczas przywracania bazy danych

  5. Bardziej bezpieczne i wydajne tworzenie baz danych i kodu w zaktualizowanej wersji SQL Complete