SQL 服务器:用相应的行值分组
SQL Server : group by with corresponding row values
我需要为具有多个日期和序列列的 table 查询编写一个 T-SQL 组:
DROP TABLE #temp
CREATE TABLE #temp(
id char(1),
dt DateTime,
seq int)
Insert into #temp values('A','2015-03-31 10:00:00',1)
Insert into #temp values('A','2015-08-31 10:00:00',2)
Insert into #temp values('A','2015-03-31 10:00:00',5)
Insert into #temp values('B','2015-09-01 10:00:00',1)
Insert into #temp values('B','2015-09-01 10:00:00',2)
我希望结果只包含项目 A、B 及其 最新日期 和 对应的 序列号,例如:
id MaxDate CorrespondentSeq
A 2015-08-31 10:00:00.000 2
B 2015-09-01 10:00:00.000 2
我正在尝试(显然是错误的!):
select id, max(dt) as MaxDate, max(seq) as CorrespondentSeq
from #temp
group by id
哪个returns:
id MaxDate CorrespondentSeq
A 2015-08-31 10:00:00.000 5 <-- 5 is wrong
B 2015-09-01 10:00:00.000 2
我怎样才能做到这一点?
编辑
dt datetime
列有重复值(完全相同的日期!)
我正在使用 SQL Server 2005
Select id, dt, seq
From #temp t
where dt = (Select Max(dt) from #temp
Where id = t.Id)
如果有重复行,那么您还需要指定查询处理器应该使用什么来确定哪些重复行 return。假设您想要 seq
、
的最低值
那么你可以这样写:
Select id, dt, seq
From #temp t
where dt = (Select Max(dt) from #temp
Where id = t.Id)
and seq = (Select Min(Seq) from #temp
where id = t.Id
and dt = t.dt)
您可以使用排名子选择来仅获取 id 排名最高的条目:
select id, dt, seq
from (
select id, dt, seq, rank() over (partition by id order by dt desc, seq desc) as r
from #temp
) ranked
where r=1;
经过反复试验,也许我找到了解决方案,但我不完全确定这是正确的:
select A.id, B.dt, max(B.seq)
from (select id, max(dt) as maxDt
from #temp
group by id) as A
inner join #temp as B on A.id = B.id AND A.maxDt = B.dt
group by A.id, B.dt
SELECT ID, DT, SEQ
FROM (
SELECT ID, DT, SEQ, Row_Number()
OVER (PARTITION BY id ORDER BY dt DESC, seq DESC) AS row_number
FROM temp
) cte
WHERE row_number = 1;
我需要为具有多个日期和序列列的 table 查询编写一个 T-SQL 组:
DROP TABLE #temp
CREATE TABLE #temp(
id char(1),
dt DateTime,
seq int)
Insert into #temp values('A','2015-03-31 10:00:00',1)
Insert into #temp values('A','2015-08-31 10:00:00',2)
Insert into #temp values('A','2015-03-31 10:00:00',5)
Insert into #temp values('B','2015-09-01 10:00:00',1)
Insert into #temp values('B','2015-09-01 10:00:00',2)
我希望结果只包含项目 A、B 及其 最新日期 和 对应的 序列号,例如:
id MaxDate CorrespondentSeq
A 2015-08-31 10:00:00.000 2
B 2015-09-01 10:00:00.000 2
我正在尝试(显然是错误的!):
select id, max(dt) as MaxDate, max(seq) as CorrespondentSeq
from #temp
group by id
哪个returns:
id MaxDate CorrespondentSeq
A 2015-08-31 10:00:00.000 5 <-- 5 is wrong
B 2015-09-01 10:00:00.000 2
我怎样才能做到这一点?
编辑
dt datetime
列有重复值(完全相同的日期!)
我正在使用 SQL Server 2005
Select id, dt, seq
From #temp t
where dt = (Select Max(dt) from #temp
Where id = t.Id)
如果有重复行,那么您还需要指定查询处理器应该使用什么来确定哪些重复行 return。假设您想要 seq
、
那么你可以这样写:
Select id, dt, seq
From #temp t
where dt = (Select Max(dt) from #temp
Where id = t.Id)
and seq = (Select Min(Seq) from #temp
where id = t.Id
and dt = t.dt)
您可以使用排名子选择来仅获取 id 排名最高的条目:
select id, dt, seq
from (
select id, dt, seq, rank() over (partition by id order by dt desc, seq desc) as r
from #temp
) ranked
where r=1;
经过反复试验,也许我找到了解决方案,但我不完全确定这是正确的:
select A.id, B.dt, max(B.seq)
from (select id, max(dt) as maxDt
from #temp
group by id) as A
inner join #temp as B on A.id = B.id AND A.maxDt = B.dt
group by A.id, B.dt
SELECT ID, DT, SEQ
FROM (
SELECT ID, DT, SEQ, Row_Number()
OVER (PARTITION BY id ORDER BY dt DESC, seq DESC) AS row_number
FROM temp
) cte
WHERE row_number = 1;