2008-10-31 4 views
4

select max(DELIVERY_TIMESTAMP) from DOCUMENTS; вернет время доставки последнего документа. Как мне вернуть другие столбцы для получения последнего документа? Например, я хочу DOC_NAME для документа, который был недавно доставлен?SQL Поиск по MAX()

Я не уверен, как сформировать пункт WHERE.

ответ

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() находится только над одной колонкой для всех строк)

Это где опция 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

Cade, я собирался ответить с помощью решения JOIN, а затем я проверил план выполнения для каждой техники. Sql Server 2005 (db, который мне удобен) использует один и тот же план выполнения для каждого синтаксиса. Итак, у вас есть выбор ... и производительность не пострадает – 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

Это работает только в том случае, если вы заказываете MAX (DELIVERY_TIMESTAMP) и занимаете ТОП 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