Greatest-N-per-Group
按日期查詢最後一條記錄,條件為真
A 提出了這個查詢,現在可以完美執行:
SELECT t.DocID, t.RevID, t.EffDate FROM tblRev AS t INNER JOIN ( SELECT DocID, max(EffDate) AS MAXEffDate FROM tblRev GROUP BY DocID ) AS tm ON (t.EffDate = tm.MAxEffDate) AND (t.DocID = tm.DocID);
基本上在我的文件數據庫中,所有文件都有修訂版(1.0、1.1、1.2 等)。我可以按日期查詢最近的修訂,但表中有一個
tblRev.OK
列(真/假)。我需要插入一條
WHERE
語句來查詢最後一個 Revision wheretblRev.OK=true
。例如(表):
DocID - RevID - RevDate - OK 1 - 1.0 - jan 1 - true 1 - 1.1 - feb 2 - true 1 - 1.2 march3 - false
所以我想要這條線:
1 - 1.1 - feb 2 - true
如果我查詢列出 al Revs where=true,我可以做到這一點,但如果可能的話,我應該在一個查詢中做到這一點。
有多種方法可以進行這種查詢(每組最大 n ),它們也因 DBMS(語法和性能)而異,但您擁有的標準 SQL 幾乎適用於所有產品。
在不改變查詢結構的情況下,您只需要在外部和內部子查詢中添加條件:
SELECT t.DocID, t.RevID, t.EffDate FROM tblRev AS t INNER JOIN ( SELECT DocID, max(EffDate) AS MAXEffDate FROM tblRev WHERE OK = TRUE GROUP BY DocID ) AS tm ON (t.EffDate = tm.MAxEffDate) AND (t.DocID = tm.DocID) WHERE t.OK = TRUE ;
如果 有
UNIQUE
約束,則不需要(DocID, RevDate)
外部檢查。(WHERE t.OK = TRUE)
次要(改進或混淆?):
WHERE OK = TRUE
可以縮短為WHERE = OK
,因為OK
它包含布爾值。