[英]Select 1 row after group by multiple columns SQL Server
我有一个包含ids,versions,timestamp的表,我需要获取每个id的最新版本,其中版本数超过1。
例如
123 1.5 2015-03-28 08:21:04.563
123 1.4 2015-02-28 08:21:04.563
234 1.5 2015-06-28 08:21:04.563
234 1.4 2015-05-28 08:21:04.563
234 1.3 2015-04-28 08:21:04.563
345 1.5 2015-01-28 08:21:04.563
在上面的数据ID 123和234中有多个版本。我需要获取max(timestamp)以及ID和版本
产量
123 1.5 2015-03-28 08:21:04.563
234 1.5 2015-06-28 08:21:04.563
我有以下sql,每个ID给我1行,但是我只需要排除1个版本的ID。
;with versions as
(
select id,
version,
row_no = row_number() over (partition by id order by max(dt_create) desc),
dt_create = max(dt_create)
from table_name
group by id, version
)
select id,version,row_no, dt_create
from versions
where row_no=1
order by id
您不需要row_number中的汇总。 另外,您可能希望使用IN
子句来限制您指定的ID。
附带说明,row_number比其他答案中使用的聚合要快得多。 您在原始查询中的不错选择。
;with versions as
(
select id,
version,
row_no = row_number() over (partition by id order by dt_create desc)
from table_name
)
select id,version,row_no, dt_create
from versions
where row_no=1 and id in (select id from versions where row_no > 1)
order by id
应该这样做:
;with mycte as (
select 123 as ID, 1.5 as version, '2015-03-28 08:21:04.563' as timestamp
union all
select 123, 1.4, '2015-02-28 08:21:04.563'
union all
select 234, 1.5, '2015-06-28 08:21:04.563'
union all
select 234, 1.4, '2015-05-28 08:21:04.563'
union all
select 234, 1.3, '2015-04-28 08:21:04.563'
union all
select 345, 1.5, '2015-01-28 08:21:04.563'
)
Select ID
, max(version) as version
, max(timestamp) as timestamp
,count(*) as total
from mycte
group by ID
having count(*) >1
您的查询已关闭。 添加HAVING
子句以排除仅具有一个版本的记录
;with versions as
(
select id,
version,
row_no = row_number() over (partition by id order by max(dt_create) desc),
dt_create = max(dt_create)
from table_name
group by id, version
having COUNT(*) > 1
)
select id,version,row_no, dt_create
from versions
where row_no=1
order by id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.