Получить максимальный столбец с группой по - PullRequest
1 голос
/ 22 июля 2010

У меня есть таблица содержания на странице.Страница разделена на разделы.Я хочу получить последнюю версию для каждого раздела страницы.

Id (int) Версия (int) SectionID

Id    Version    SectionID    Content
1       1           1           AAA
2       2           1           BBB
3       1           2           CCC
4       2           2           DDD
5       3           2           EEE

Я хочу получить:

Id    Version    SectionID    Content
2       2           1           BBB
5       3           2           EEE

Ответы [ 4 ]

1 голос
/ 22 июля 2010

Пример определения таблицы:

declare @t table(Id int, [Version] int, [SectionID] int, Content varchar(50))

insert into @t values (1,1,1,'AAA');
insert into @t values (2,2,1,'BBB');
insert into @t values (3,1,2,'CCC');
insert into @t values (4,2,2,'DDD');
insert into @t values (5,3,2,'EEE');

Рабочий раствор:

select A.Id, A.[Version], A.SectionID, A.Content
from @t as A
join (
    select max(C.[Version]) [Version], C.SectionID
    from @t C
    group by C.SectionID
) as B on A.[Version] = B.[Version] and A.SectionID = B.SectionID
order by A.SectionID
1 голос
/ 22 июля 2010

Более простое и доступное решение:

select A.Id, A.[Version], A.SectionID, A.Content
from @t as A
where A.[Version] = (
    select max(B.[Version])
    from @t B
    where A.SectionID = B.SectionID
)
1 голос
/ 22 июля 2010

Вы можете использовать эксклюзивное самостоятельное объединение:

select  last.*
from    YourTable last
left join
        YourTable new
on      new.SectionID = last.SectionID
        and new.Version > last.Version
where   new.Id is null

Оператор where в основном говорит: где нет более новой версии этой строки.

Чуть более читабельно, но частомедленнее, это not exists условие:

select  *
from    YourTable yt
where   not exists
        (
        select  *
        from    YourTable yt2
        where   yt2.SectionID = yt.SectionID
                and yt2.Version > yt.Version
        )
0 голосов
/ 22 июля 2010

Я только что увидел, что для Oracle очень похож с принятым ответом, основанным на производительности.

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

select Id, Version, SectionID, Content
from (
    select Id, Version, SectionID, Content,
           max(Version) over (partition by SectionID) max_Version
    from   @t
) A
where Version = max_Version
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...