在sql中排名前2位

时间:2014-03-22 09:00:28

标签: sql

这是我在sql-server中的测试表

表结构是这个

表A

status   id    Col1    Col2      Col3      Date
A        111     Name1   Name4     Name6     2/18/14 5:54
B        111     Name1   Name5     Name6     3/18/14 5:54
B        111     Name2   Name6     Name6     5/12/14 5:54
B        111     Name2   Name6     Name7     10/11/13 3:34

必填结果:

status   id    Col1    Col2      Col3      Date
A        111     Name1   Name4     Name6     2/18/14 5:54
B        111     Name1   Name5     Name6     3/18/14 5:54

答案必须是通用的解决方案,因为我不知道客户的RDBMS:

我是在sql-server中完成的:

select * 
  from (select *, 
               row_number() over(partition by status order by Date desc) as rn 
          from table
        ) 
 where rn=1

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

select t1.* 
from table t1
join (select status, MAX(Date) as maxDate
      from table
      group by status) m
on m.status = t1.status and m.maxDate = t1.Date

答案 1 :(得分:3)

假设每个状态只有一个最大日期,以下可能是最有效的方法:

select t.*
from table t
where not exists (select 1 from table t2 where t2.status = t.status and t2."date" > t."date");

为获得最佳效果,请在table(status, "date")上建立索引。

这就是说:“从表格中获取表格中dateid没有更大值的所有行”。这是一种奇特的说法,“让每个id的{​​{1}}行有date。”

答案 2 :(得分:2)

这是一个更通用的解决方案(不使用像row_number()这样的函数),但我相信在命名列Date时语法和问题仍然存在差异(很可能是关键字/数据类型)。将其视为伪sql。

select mytable.* from mytable
inner join
(
    select status, max(Date) Date
    from mytable
    group by status
) X
on X.status = mytable.status and X.Date = mytable.Date

如果状态的最大日期相同且记录超过1条,则结果会有差异。问题中的查询将只返回1条记录,在这种情况下,我的查询将返回多于1条。