这是我在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
非常感谢任何帮助!
答案 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")
上建立索引。
这就是说:“从表格中获取表格中date
对id
没有更大值的所有行”。这是一种奇特的说法,“让每个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条。