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

SQL Server 分組取每組最新一筆資料(ROW_NUMBER 實戰)

     編輯:MySQL 資料庫相關知識

業務場景

工單明細表需按旗標 flag_3 分組,取每組建立時間最新的一筆記錄。

核心查詢

SELECT * FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY wok.flag_3 ORDER BY wok.createtime DESC) AS rownum
    FROM (
        SELECT 
            workh.corp_code, workh.corp_name, workh.begin_date, workh.createtime,
            workh.flag_1, workh.flag_2,
            workb.main_id, workb.production_quantity, workb.spare_capacity,
            workb.equipment_code, workb.flag_3
        FROM imp_workorderh workh
        RIGHT JOIN imp_workorderb workb ON workb.main_id = workh.id
        WHERE workh.teachingplanid = '0000AA10000000016F6U'
    ) wok
) h
WHERE h.rownum = 1;

關鍵點解析

  • PARTITION BY flag_3:按旗標分組
  • ORDER BY createtime DESC:組內按時間倒序
  • ROW_NUMBER():分配 1,2,3... 序號
  • 外層 WHERE rownum = 1:取每組第一筆(最新)

擴展應用

  • 取前 N 筆:WHERE rownum <= N
  • 多欄位分組:PARTITION BY col1, col2
  • 配合 CTE 簡化:WITH cte AS (...) SELECT * FROM cte WHERE rownum=1
  • 效能優化:分組欄位 + 排序欄位建立複合索引

版本相容性

ROW_NUMBER() 需 SQL Server 2005+,2000 需用舊寫法(TOP 1 + 關聯子查詢)。

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