Выбрать несколько отдельных строк из таблицы SQL

Я пытаюсь выбрать отдельные (последние обновленные) строки из таблицы в моей базе данных. Я пытаюсь получить последнюю обновленную строку для каждого «Подраздела». Однако я не могу найти способ добиться этого.

Таблица выглядит так:

ID    | Name   |LastUpdated                  | Section    | Sub    |

1     | Name1  | 2013-04-07 16:38:18.837     | 1          | 1      |
2     | Name2  | 2013-04-07 15:38:18.837     | 1          | 2      |
3     | Name3  | 2013-04-07 12:38:18.837     | 1          | 1      |
4     | Name4  | 2013-04-07 13:38:18.837     | 1          | 3      |
5     | Name5  | 2013-04-07 17:38:18.837     | 1          | 3      |

Я пытаюсь заставить свой оператор SQL возвращать строки:

1, 2 и 5.

Они различны для Sub и самых последних.

Я пытался:

SELECT DISTINCT Sub, LastUpdated, Name 
FROM TABLE 
WHERE LastUpdated = (SELECT MAX(LastUpdated) FROM TABLE WHERE Section = 1)

Что возвращает только отдельную строку для самой последней обновленной строки. В этом есть смысл.

Я погуглил, что пытаюсь, и проверил соответствующие сообщения здесь. Однако не удалось найти тот, который действительно отвечает на то, что я пытаюсь.


person LostCoderBoy    schedule 07.04.2013    source источник


Ответы (2)


Вы можете использовать оконную функцию row_number(), чтобы назначить номера для каждого раздела строк с одинаковым значением Sub. Используя order by LastUpdated desc, строка с номером один будет последней строкой:

select  *
from    (
        select  row_number() over (
                    partition by Sub 
                    order by LastUpdated desc) as rn
        ,       *
        from    YourTable
        ) as SubQueryAlias
where   rn = 1
person Andomar    schedule 07.04.2013
comment
Спасибо! Именно то, что я пытался выяснить. - person LostCoderBoy; 07.04.2013

Разве не было бы достаточно использовать group by?

SELECT DISTINCT MIN(Sub), MAX(LastUpdated), MIN(NAME) FROM TABLE GROUP BY Sub Where Section = 1
person Adrian    schedule 07.04.2013
comment
В вашем запросе min(name) может не принадлежать той же строке, что и max(LastUpdated). - person Andomar; 07.04.2013