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

SQL 找出重複次數最多的記錄組合:GROUP BY + HAVING + TOP 1 實戰

     編輯:關於SqlServer

需求:從百萬筆樂透模擬資料中,找出出現次數最多的號碼組合。本文示範使用 GROUP BY 搭配 HAVING 過濾重複群組,再以 ORDER BY COUNT(*) DESC 取得最高頻組合,附帶效能優化建議。

建立測試資料

CREATE TABLE LottoDraw (
    DrawID INT IDENTITY(1,1) PRIMARY KEY,
    N1 TINYINT, N2 TINYINT, N3 TINYINT,
    N4 TINYINT, N5 TINYINT, N6 TINYINT,
    N7 TINYINT
);

-- 假設已填入 1,000,000 筆模擬資料

核心查詢

SELECT TOP 1
    N1, N2, N3, N4, N5, N6, N7,
    COUNT(*) AS Freq
FROM LottoDraw
GROUP BY N1, N2, N3, N4, N5, N6, N7
HAVING COUNT(*) > 1
ORDER BY Freq DESC;

關鍵子句解析

子句作用
GROUP BY依 7 個號碼欄位分群,相同組合歸為一列
HAVING COUNT(*) > 1僅保留出現超過 1 次的群組(即重複組合)
ORDER BY Freq DESC依出現頻率遞減排序
TOP 1取得最高頻組合

進階變體

取得前 10 高頻組合

SELECT TOP 10 N1,N2,N3,N4,N5,N6,N7, COUNT(*) AS Freq
FROM LottoDraw
GROUP BY N1,N2,N3,N4,N5,N6,N7
HAVING COUNT(*) > 1
ORDER BY Freq DESC;

包含單一出現組合的完整頻率分布

SELECT N1,N2,N3,N4,N5,N6,N7, COUNT(*) AS Freq
FROM LottoDraw
GROUP BY N1,N2,N3,N4,N5,N6,N7
ORDER BY Freq DESC;

效能優化建議

  • 索引:在 7 個號碼欄位建立複合索引 CREATE INDEX IX_Lotto_Numbers ON LottoDraw(N1,N2,N3,N4,N5,N6,N7),加速分群排序。
  • 分區:若資料超過 5000 萬筆,考慮依 DrawID 或日期分區。
  • 彙總表:定期跑 Batch 更新彙總表 LottoFreq,查詢時直接讀彙總表,毫秒級回應。
  • 記憶體:確保 MAX SERVER MEMORY 留足給查詢工作區,避免溢寫 TempDB。

常見誤區

❌ SELECT DISTINCT * FROM T HAVING COUNT(*) > 1 — DISTINCT 無法搭配 HAVING 使用。
✅ 必須 GROUP BY 所有欄位再 HAVING。

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