以行组的形式查找最新日期

时间:2017-02-07 17:23:17

标签: sql sql-server

在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;序列之间的行

我需要获取列表的最新日期,但如果首先有一组相同的状态,我需要返回它们的最短日期。最好的方法是什么?

2 个答案:

答案 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返回表中最新行的idwhere子句中的子查询选择表中任何其他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 1order 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

检查一次查询多次出现的所有状态,然后从这些状态中选择最短日期。