在SQL Server 2012中给出这个值列表:
Status Date
------ -----------
1 2016-12-01
1 2016-11-02
1 2016-10-20 <-- THIS
2 2016-10-01
1 2016-09-21 <-- (*)
3 2016-08-15
(*)不需要这个,因为有一个&#34;状态2&#34;序列之间的行
我需要获取列表的最新日期,但如果首先有一组相同的状态,我需要返回它们的最短日期。最好的方法是什么?
答案 0 :(得分:2)
一种方法根本不使用窗口函数:
select top 1 t.*
from t cross join
(select top 1 t2.id from t t2 order by t2.date desc) tt
where t.date > ifnull((select max(t2.date) from t t2 where t2.id <> tt.id), '2000-01-01')
order by t.date;
子查询tt
返回表中最新行的id
。 where
子句中的子查询选择表中任何其他id的最大日期。然后where
中的比较选择所有最近的记录。
使用窗口函数,lag()
可能是最简单的:
select top 1 t.*
from (select t.*, lag(status) over (order by date) as prev_status
from t
) t
where prev_status <> status or prev_status is null
order by date desc;
where
子句获取状态更改的行。 top 1
和order by date
获取最近发生的时间。
答案 1 :(得分:1)
我会做这样的事情:
select
status,
min(date)
from table
where status in
(select
status
from table
group by 1
having count(date) > 1)
group by 1
检查一次查询多次出现的所有状态,然后从这些状态中选择最短日期。