Поиск SQL по MAX () - PullRequest
       36

Поиск SQL по MAX ()

4 голосов
/ 31 октября 2008

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

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

Ответы [ 5 ]

6 голосов
/ 31 октября 2008

У вас есть несколько вариантов

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
4 голосов
/ 31 октября 2008
SELECT
  DELIVERY_TIMESTAMP,
  OTHER_COLUMN
FROM
  DOCUMENTS
WHERE
  DELIVERY_TIMESTAMP = (SELECT MAX(DELIVERY_TIMESTAMP) FROM DOCUMENTS)
2 голосов
/ 31 октября 2008

В некоторых версиях SQL (например, MySQL) вы можете сделать это:

SELECT *
FROM DOCUMENTS
ORDER BY DELIVERY_TIMESTAMP DESC
LIMIT 1
2 голосов
/ 31 октября 2008

В MSSQL тоже работает следующее:

SELECT TOP 1 * FROM DOCUMENTS ORDER BY DELIVERY_TIMESTAMP DESC
1 голос
/ 31 октября 2008
Select Max(DELIVERY_TIMESTAMP), 
       Doc_Name
From TableName
Group By Doc_Name

Это должно сработать, если я не пропустил что-то в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...