SQL: как сделать запрос, который возвращает последнюю созданную строку для каждого пользователя из данных таблицы - PullRequest
1 голос
/ 03 октября 2011

Рассмотрим следующие данные таблицы

ID      UserID  ClassID SchoolID    Created
2184    19313   10      28189       2010-10-25 14:16:39.823
46697   19313   10      27721       2011-04-04 14:50:49.433
•47423  19313   11      27721       2011-09-15 09:15:51.740
•47672  19881   11      42978       2011-09-19 17:31:12.853
3176    19881   11      42978       2010-10-27 22:29:41.130
22327   19881   9       45263       2011-02-14 19:42:41.320
46661   32810   11      41861       2011-04-04 14:26:14.800
•47333  32810   11      51721       2011-09-13 22:43:06.053
131     32810   11      51721       2010-09-22 03:16:44.520

Я хочу сделать SQL-запрос, который возвращает последнюю созданную строку для каждого UserID , в котором результат будет таким, как показано ниже (строка, которая начинаетсяс в вышеуказанных строках):

ID      UserID  ClassID SchoolID    Created
47423   19313   11      27721       2011-09-15 09:15:51.740
47672   19881   11      42978       2011-09-19 17:31:12.853
47333   32810   11      51721       2011-09-13 22:43:06.053

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Вы можете использовать CTE (общее табличное выражение) с функцией ROW_NUMBER:

;WITH LastPerUser AS
(
   SELECT 
       ID, UserID, ClassID, SchoolID, Created,
       ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum')
   FROM dbo.YourTable
)
SELECT 
   ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1

Этот CTE «разбивает» ваши данные на UserID, и для каждого раздела функция ROW_NUMBER выдает последовательные числа, начиная с 1 и упорядочивая по Created DESC - так что последняя строка получает RowNum = 1 каждый UserID), который я выбираю из CTE в операторе SELECT после него.

0 голосов
/ 01 августа 2012

Я знаю, что это старый вопрос на данный момент, но у меня была та же проблема в MySQL, и я думаю, что я нашел стандартный способ решения этой проблемы.Я только что проверил это с MySQL, но я не думаю, что я использую что-либо специфичное для MySQL.

select mainTable.* from YourTable mainTable, (
    select UserID, max(Created) as Created
    from YourTable
    group by UserID
) dateTable 
where mainTable.UserID = dateTable.UserID
and mainTable.Created = dateTable.Created
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...