2008-10-31 66 views
4

select max(DELIVERY_TIMESTAMP) from DOCUMENTS;將返回最新文檔的發送時間。如何返回其他列以獲取最新文檔?例如,我想DOC_NAME爲最近交付的文檔?我不確定如何形成WHERE子句。SQL搜索MAX()

回答

6

您有幾種選擇

SELECT DOC_NAME 
FROM DOCUMENTS 
WHERE DELIVERY_TIMESTAMP IN (
    SELECT MAX(DELIVERY_TIMESTAMP) 
    FROM DOCUMENTS 
) 

或用加入

SELECT DOC_NAME 
FROM DOCUMENTS 
INNER JOIN (
    SELECT MAX(DELIVERY_TIMESTAMP) AS MAX_DELIVERY_TIMESTAMP 
    FROM DOCUMENTS 
) AS M 
    ON M.MAX_DELIVERY_TIMESTAMP = DOCUMENTS.DELIVERY_TIMESTAMP 

是否有一個時間戳副本,或者您需要在您的「MAX」多列問題就變得更復雜標準(因爲MAX()僅在所有行的一列上)

這就是JOIN選項是唯一的選擇,因爲這樣的結構不可用(說具有相同的時間戳多個訂單):

SELECT DOC_NAME 
FROM DOCUMENTS 
WHERE (DELIVERY_TIMESTAMP, ORDERID) IN (
    SELECT TOP 1 DELIVERY_TIMESTAMP, ORDERID 
    FROM DOCUMENTS 
    ORDER BY DELIVERY_TIMESTAMP DESC, ORDERID DESC 
) 

在那裏你其實需要做的:

SELECT DOC_NAME 
FROM DOCUMENTS 
INNER JOIN (
    SELECT TOP 1 DELIVERY_TIMESTAMP, ORDERID 
    FROM DOCUMENTS 
    ORDER BY DELIVERY_TIMESTAMP DESC, ORDERID DESC 
) AS M 
    ON M.DELIVERY_TIMESTAMP = DOCUMENTS.DELIVERY_TIMESTAMP 
     AND M.ORDERID = DOCUMENTS.ORDERID 
+1

凱德,我打算回覆JOIN解決方案,然後檢查每項技術的執行計劃。 Sql Server 2005(我有用的db)爲每種語法使用相同的執行計劃。 So Paul,你有你的選擇......性能不會受損 – 2008-10-31 15:58:53

1
Select Max(DELIVERY_TIMESTAMP), 
     Doc_Name 
From TableName 
Group By Doc_Name 

這應該這樣做,除非我錯過了一些問題。

+0

我不知道任何SQL變體,這是保證工作,至少在Oracle上它肯定不會。 – Alnitak 2008-10-31 16:20:16

+0

只有當您訂購BY MAX(DELIVERY_TIMESTAMP)並取得TOP 1時,此功能纔有效。 – 2008-10-31 16:32:30

4
SELECT 
    DELIVERY_TIMESTAMP, 
    OTHER_COLUMN 
FROM 
    DOCUMENTS 
WHERE 
    DELIVERY_TIMESTAMP = (SELECT MAX(DELIVERY_TIMESTAMP) FROM DOCUMENTS) 
+0

這比我的更好,我爲您投票。 – 2008-10-31 15:54:51

2

在MSSQL中,下面的工作太:

SELECT TOP 1 * FROM DOCUMENTS ORDER BY DELIVERY_TIMESTAMP DESC 
2

在SQL的某些版本(即MySQL)你可以這樣做:

SELECT * 
FROM DOCUMENTS 
ORDER BY DELIVERY_TIMESTAMP DESC 
LIMIT 1