Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL Server:具有相应行值的分组依据_Tsql_Sql Server 2005 - Fatal编程技术网

Tsql SQL Server:具有相应行值的分组依据

Tsql SQL Server:具有相应行值的分组依据,tsql,sql-server-2005,Tsql,Sql Server 2005,我需要为具有多个日期和seq列的表编写一个T-SQL group by查询: 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 int

我需要为具有多个日期和seq列的表编写一个T-SQL group by查询:

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
我正在尝试(显然是错误的!):

返回:

id  MaxDate CorrespondentSeq
A   2015-08-31 10:00:00.000 5  <-- 5 is wrong
B   2015-09-01 10:00:00.000 2
id MaxDate对应项seq
A 2015-08-31 10:00:00.000 5
如果存在重复的行,那么您还需要指定查询处理器应该使用什么来确定返回哪些重复行。假设您想要
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

演示:

如果日期相等,则返回:id dt seq B 2015-09-01 10:00:00.000 1b 2015-09-01 10:00:00.000 2a 2015-08-31 10:00:00.000 2(返回两行!)我非常喜欢这个解决方案,因为我认为它是最详细的解决方案。。。首先,它按dt对表排序,按id对表进行seq分区。。。然后选择排名为1的行。。。聪明!如果存在具有相同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;