這個問題在這里已經有了答案: 從資料庫中檢索每個組中的最后一條記錄 - SQL Server 2005/2008 2答案 獲取每組的前 1 行 (19 個答案) 昨天關門。
我在 SQL Server 中有這張表:
| 部門編號 | 部門 | 員工ID | 速度 | 速率修改日期 |
|---|---|---|---|---|
| 16 | 管理人員 | 234 | 39.0600 | 2009-01-31 00:00:00.000 |
| 16 | 管理人員 | 234 | 48.5577 | 2011-11-14 00:00:00.000 |
| 16 | 管理人員 | 234 | 60.0962 | 2012-01-29 00:00:00.000 |
| 16 | 管理人員 | 1 | 125.5000 | 2009-01-14 00:00:00.000 |
我想要RateModifiedDate每個員工的最新資訊,如下所示:
| 部門編號 | 部門 | 員工ID | 速度 | 速率修改日期 |
|---|---|---|---|---|
| 16 | 管理人員 | 234 | 60.0962 | 2012-01-29 00:00:00.000 |
| 16 | 管理人員 | 1 | 125.5000 | 2009-01-14 00:00:00.000 |
uj5u.com熱心網友回復:
您在正確的軌道上用于MAX查找最新日期。您的查詢不起作用的原因是您需要查找多個最新資料。您需要每位員工的最新日期。這可以使用子查詢來完成:
SELECT DepartmentID, Department, EmployeeID, rate, RateModifiedDate
FROM yourtable y1
WHERE RateModifiedDate =
(SELECT MAX(y2.RateModifiedDate)
FROM yourtable y2
WHERE y1.EmployeeID = y2.EmployeeID)
ORDER BY RateModifiedDate DESC;
主查詢將選擇所有應顯示的列并按日期對它們進行排序,從最新的開始。子查詢將查找每位員工的最新日期。主查詢的WHERE子句將確保只選擇日期與當前員工的最新日期匹配的條目。因此,結果將完全符合要求。
此查詢將在每個 DB 型別上執行,因為它不包含特定于 DB 型別的語法。
除了這個通用選項之外,常見的 DB 還提供了類似的視窗函式,這些函式RANK可以“自行”完成這些事情。所以你也可以創建這樣一個查詢:
SELECT DepartmentID, Department, EmployeeID, rate, RateModifiedDate
FROM (SELECT DepartmentID,
Department,
EmployeeID,
rate,
RateModifiedDate,
RANK() OVER(PARTITION BY EmployeeID ORDER BY RateModifiedDate DESC) dest_rank
FROM yourtable) sub
WHERE dest_rank = 1
ORDER BY RateModifiedDate DESC;
此查詢的結果將是相同的。
子查詢中的子句將按PARTITION BY員工分組資料,ORDER BY子句將按日期排序,從最新開始。主查詢的WHERE子句將僅從子查詢中獲取排序串列中具有最新日期的資料。
此查詢不會在每種 DB 型別上執行,因為視窗函式的語法和命名通常不同,而且較舊的 DB 版本可能不提供它們。
這將是上述兩個查詢的結果:
| 部門編號 | 部門 | 員工ID | 速度 | 速率修改日期 |
|---|---|---|---|---|
| 16 | 管理人員 | 234 | 60.0962 | 2012-01-29 |
| 16 | 管理人員 | 1 | 125.5000 | 2009-01-14 |
在這里試試:db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528468.html
標籤:sqlsql服务器
