首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 分組取前 N 筆資料兩種寫法

     編輯:MySQL 資料庫相關知識

方法一:IN 子查詢(簡單場景)

SELECT a.* 
FROM table1 a 
WHERE a.column1 IN (
    SELECT MAX(column1) 
    FROM table1 
    GROUP BY a.column2, column3
);

適用:單欄位分組、取極值、資料量中等。

方法二:ROW_NUMBER() 窗口函數(通用標準寫法)

WITH nyr AS (
    SELECT 
        NYR, QYZX_DM, FXSP_XH, SPBM_DLJ, WBSP_GG, JGLX, JZJG, MAX(SJGX_SJ),
        ROW_NUMBER() OVER (PARTITION BY NYR ORDER BY NYR) AS rowno
    FROM WD_O_T_IC_SPSJ_FX
    GROUP BY NYR, QYZX_DM, FXSP_XH, SPBM_DLJ, WBSP_GG, JGLX, JZJG
)
SELECT * FROM nyr WHERE rowno = 1;

關鍵語法修正

原文 WHERE rowno=1 置於 CTE 內部會報錯,正確寫法:

  1. CTE 內只定義 rowno
  2. 外層查詢 WHERE rowno = 1

擴展:取前 N 筆

WHERE rowno <= N

效能建議

  • 分組欄位 + 排序欄位建立複合索引
  • 大資料量避免 IN 子查詢,改用 ROW_NUMBER 或 CROSS APPLY
  • CROSS APPLY 寫法(SQL Server 專用,效能通常最優):
SELECT t.*
FROM TableA g
CROSS APPLY (
    SELECT TOP 1 * FROM TableB d WHERE d.group_id = g.id ORDER BY d.created DESC
) t;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved