2008-10-31 56 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