Sql заявление вопрос - PullRequest
1 голос
/ 10 мая 2011

У меня есть таблица, которая содержит журналы и имеет следующую схему:

USER | DATE | LOG
x      x      x
...

Теперь я хочу сделать запрос ONE для получения каждой пары (USER, DATE), где DATE - последняя для этого пользователя.

Я думал о чем-то вроде (псевдо):

SELECT ... FROM (TABLE) ORDERED BY DATE, DISTINCT BY USER

Но я не уверен, сработает ли это.

Правильно ли, что DISTINCT будет принимать первые возможные даты в этом запросе, что даст требуемый результат? Или порядок элементов в запросе DISTINCT не определен?


Если да, как мне решить эту проблему (в этом случае я не могу добавить новую таблицу, такую ​​как users и, например, кэшировать там самые последние даты) ?

Ответы [ 4 ]

1 голос
/ 11 мая 2011

Если ваша база данных поддерживает управление окнами, вы можете сделать это с помощью

SELECT user, date, log FROM
(SELECT user, date, log, row_number()
  OVER (PARTITION BY user ORDER BY date DESC) AS rn) FROM table_name) AS subq
WHERE rn=1;
1 голос
/ 11 мая 2011

Теперь я хочу сделать ОДИН запрос для получения каждой пары (USER, DATE), где DATE - последняя для этого пользователя.

select user, max(date)
from yourtable
group by user

Возможно, вы захотите добавитьORDER BY user.

Поскольку оба значения user и date являются зарезервированными словами для большинства SQL-баз данных, это, скорее всего, будет выполняться.

select "user", max("date")
from "yourtable"
group by "user";
0 голосов
/ 11 мая 2011

самое простое решение будет

select user, max(date)
from tableName
group by user

Это делает то, что вы просите - но если вы добавите «log» к запросу, вам нужно использовать подзапрос.

0 голосов
/ 10 мая 2011

DISTINCT сам по себе не совсем сделает то, что вы хотите, так как вы хотите самую большую дату на пользователя, вам нужно сделать подзапрос. Порядок в запросе гарантирует, что вы получите самую большую дату.

    SELECT DISTINCT USER
         , DATE
         , LOG
      FROM TABLE AS T1
     WHERE DATE = (SELECT TOP 1 DATE
                     FROM TABLE AS T2
                    WHERE T2.USER = T1.USER
                 ORDER BY DATE DESC)
...