Greatest-N-per-Group

按日期查詢最後一條記錄,條件為真

  • April 22, 2016

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 where tblRev.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它包含布爾值。

引用自:https://dba.stackexchange.com/questions/136196