SSMS
 sql >> Teknologi Basis Data >  >> Database Tools >> SSMS

Pisahkan set ke dalam ember persentase yang tidak rata

Tidak tahu, jika saya mendapatkan ini dengan benar...

Pertama-tama tampaknya ada kesalahan yang agak jelas di sini:

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

Bukankah ini seharusnya:

    WHEN t.bucket >90 THEN 'NULL'

Fungsi NTILE akan menyebarkan set Anda ke dalam ember yang agak rata. Periksa output saya dan temukan bagaimana perilaku ini di kasus sudut. Saya sarankan untuk menggunakan persentase yang dihitung per baris seperti di sini:

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;

--Saya menggunakan #tmpBuckets-table ini untuk lebih dekat dengan Saya punya meja skenario

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;

Saya pikir Anda tahu, cara menggunakan cte seperti itu untuk memperbarui tabel sumber. Jika tidak, kembali saja dengan pertanyaan lain :-)




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Pintasan keyboard untuk secara otomatis membungkus teks yang dipilih di IsNull([teks], 0) di SSMS

  2. Bagaimana Anda men-debug atau menelusuri kode di SQL Server Management Studio 18?

  3. Masukkan Data Ke Tabel Temp dengan Query

  4. Penjualan Luar Biasa Harian SQL, Agregat Bergulir?

  5. Bagaimana cara menghapus daftar database yang terhapus secara tidak sengaja dari daftar seperti pohon Sql Server Management Studio?