首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 中位數查詢實作:排序排名法與 (COUNT+1)/2 公式

     編輯:關於SqlServer

SQL 無內建中位數函數,可透過自連接排序排名法計算。本文以 Total_Sales 表為例,示範標準寫法與關鍵邏輯。

測試資料

中位數查詢 SQL

SELECT * FROM (
    SELECT a1.Name, a1.Sales, COUNT(a2.Sales) AS Sales_Rank
    FROM Total_Sales a1, Total_Sales a2
    WHERE a1.Sales < a2.Sales 
       OR (a1.Sales = a2.Sales AND a1.Name = a2.Name)
    GROUP BY a1.Name, a1.Sales
    ORDER BY a1.Sales DESC, a1.Name DESC
) AS ranked
WHERE Sales_Rank = (SELECT (COUNT(*) + 1) / 2 FROM Total_Sales);

關鍵邏輯解析

  • 自連接排名:a1 對 a2,統計「嚴格大於 a1」的筆數 → 排名(1 為最大)
  • 同分處理:a1.Sales = a2.Sales AND a1.Name = a2.Name 確保同分同名僅計一次
  • 中位數位置:(COUNT(*) + 1) / 2(整數除法)
    • 奇數筆 (7) → (7+1)/2 = 4 → 第 4 大
    • 偶數筆 (6) → (6+1)/2 = 3 → 第 3 大(取較小中位數)
  • +1 必要性:無 +1 時奇數筆會偏移一位

結果驗證

現代替代方案(SQL Server 2012+)

-- 使用 PERCENTILE_CONT (需排序)
SELECT DISTINCT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Sales) OVER () AS Median
FROM Total_Sales;

-- 或 PERCENTILE_DISC 取實際資料值
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Sales) OVER () FROM Total_Sales;

舊版相容用排序排名法,新版優先用窗函數,語意更清晰、效能更佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved