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

SQL Server 分組取 Top N 百分比資料:CROSS APPLY 實作範例

     編輯:關於SqlServer

需求情境

針對每個經銷商在各縣市的兩類客戶(CustChannelID 1027、1028),依銷量排序取前 10% 的客戶進行電話調查。

核心查詢腳本

SELECT DISTINCT
    b.OrgID, b.CompanyID, b.AreaID, b.CustChannelID, b.CustID, b.SaleTotalQty,
    GETDATE()
FROM KDS400TelSurveyCustAll_Temp AS tmp1
CROSS APPLY (
    SELECT TOP 10 PERCENT *
    FROM KDS400TelSurveyCustAll_Temp tmp2
    WHERE tmp1.OrgID = tmp2.OrgID
      AND tmp1.CompanyID = tmp2.CompanyID
      AND tmp1.AreaID = tmp2.AreaID
      AND tmp1.CustChannelID = tmp2.CustChannelID
      AND tmp2.CustChannelID IN (1027, 1028)
    ORDER BY tmp2.OrgID, tmp2.CompanyID, tmp2.AreaID, tmp2.AreaType, tmp2.CustChannelID
) AS b;

關鍵技術點解析

  • CROSS APPLY:針對外部查詢的每一列,執行右側的表值函數/子查詢,並可參考外部欄位(如 tmp1.OrgID),實現「分組後取 Top N」的邏輯。
  • TOP 10 PERCENT:依排序順序取前 10% 筆數,若不足 10 筆至少回傳 1 筆。
  • DISTINCT:避免多重符合條件導致重複列。

適用版本與效能建議

  • SQL Server 2005 以上支援 APPLY。
  • 大量資料建議於 OrgID, CompanyID, AreaID, CustChannelID 建立複合索引,並確保統計資料最新。
  • 若相容性層級較低,可改用 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 配合 CTE 達成相同目的。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved