Как получить максимальную версию записи? - PullRequest
1 голос
/ 05 мая 2011

У меня есть таблица, подобная следующей:

------------------------------------
Id   FId   UId   Version
1    1     1     1
2    1     2     1
3    1     3     1
4    1     2     2
5    1     3     2
6    1     3     2
7    1     4     2
8    2     1     1
9    2     2     1

тогда я хочу, чтобы результат был:

--------------------------
FId  UId   Version
1    2     2
1    3     2
1    4     2
2    1     1
2    2     1

Как написать запрос, основанный на максимальной версии каждой пары FId-UId?

Ответы [ 4 ]

4 голосов
/ 05 мая 2011

Следующее дает запрошенный вывод.

select distinct t2.FId, t2.UId, t2.Version
from
(
    select FId, max(Version) as "Version"
    from MyTable
    group by FId
) t1
inner join MyTable t2 on (t1.FId = t2.FId and t1.Version = t2.Version)
order by t2.FId, t2.UId
1 голос
/ 05 мая 2011

Это будет работать в SQL 2005 и более поздних версиях:

DECLARE @t TABLE
(Id INT,
Fid INT,
[uid] INT,
[VERSION] INT
)

INSERT @t
SELECT 1,1,1,1
UNION ALL SELECT 2,1,2,1
UNION ALL SELECT 3,1,3,1
UNION ALL SELECT 4,1,2,2
UNION ALL SELECT 5,1,3,2
UNION ALL SELECT 6,1,3,2
UNION ALL SELECT 7,1,4,2
UNION ALL SELECT 8,2,1,1
UNION ALL SELECT 9,2,2,1

;WITH myCTE
AS
(
    SELECT *,
           RANK() OVER (PARTITION BY Fid
                        ORDER BY [VERSION] DESC
                       ) AS rnk
    FROM @t
)
SELECT DISTINCT Fid, [uid],[VERSION]
FROM myCTE
WHERE rnk = 1
ORDER BY Fid, [uid]
1 голос
/ 05 мая 2011
select FId, UId, Version 
from MyTable
join (select Fid, Max(Version) as MaxVersion group by Fid) x 
on x.FId = MyTable.FId and x.MaxVersion = MyTable.Version
0 голосов
/ 05 мая 2011

Является ли результат, который вы показываете правильно - 1,3,2 должен появиться дважды. Если вам нужно только один раз, выберите отчетливо

Следующий запрос работает

with t as(
select 1 as id,   1 as fid  ,  1  as uid,   1 as version union all
select 2 ,   1 ,    2 ,    1  union all
select 3 ,   1  ,   3 ,    1  union all
select 4 ,   1 ,    2   ,  2  union all
select 5  ,  1  ,   3  ,   2  union all
select 6 ,   1  ,   3  ,  2  union all
select 7 ,   1 ,    4  ,   2  union all
select 8  ,  2  ,   1  ,   1  union all
select 9 ,   2  ,   2  ,   1)

select distinct t.fid,t.uid,t.version from t 
inner join(
select fid,max(version) as maxversion from t
group by fid)as grp
on t.fid=grp.fid 
and t.version=grp.maxversion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...