首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL:查詢每位用戶最後一筆消費記錄(使用 ROW_NUMBER 分窗函數)

     編輯:程式設計綜合問答

資料表結構

BussnissLogs
- BussnissLogsID (PK)
- UserID
- HappeningTime

標準寫法:ROW_NUMBER() OVER (PARTITION BY ...)

WITH Ranked AS (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY HappeningTime DESC) AS rn
    FROM BussnissLogs
)
SELECT *
FROM Ranked
WHERE rn = 1;

說明

  • PARTITION BY UserID:以用戶分組。
  • ORDER BY HappeningTime DESC:組內按時間倒序,最新排第一。
  • ROW_NUMBER():給每列編號,第一列為 1。
  • 外層篩選 rn = 1 即得各用戶最新一筆。

相容舊版 SQL Server (2000/2005) 的替代寫法

SELECT bl.*
FROM BussnissLogs bl
INNER JOIN (
    SELECT UserID, MAX(HappeningTime) AS MaxTime
    FROM BussnissLogs
    GROUP BY UserID
) t ON bl.UserID = t.UserID AND bl.HappeningTime = t.MaxTime;

注意:若同一用戶同一時間有多筆,會全部回傳;可再加 TOP 1 或 ROW_NUMBER 去重。

效能建議

  • 建立索引:CREATE INDEX IX_BussnissLogs_UserID_Time ON BussnissLogs(UserID, HappeningTime DESC);
  • 大資料量時,分窗函數通常比自連接更穩定高效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved