选择最小行

时间:2016-02-25 11:56:21

标签: sql tsql sql-server-2008-r2

我有一张与此类似的表格(表格):

Date        Value
20150201    5
20150205    6
20150206    0
20150207    5
20150208    0
20150209    9
20150219    7

我想在最后一次“0”出现后选择最小日期的行。在上面的例子中,最后一个0出现在20150208日期,所以我想选择它之后的行(一个日期为20150209)。日期不同。

并且,例如,如果没有值为“0”的出现,则应选择具有最小日期的行。我正在使用SQL Server 2008R2。所以,我在这里无法使用LEADLAG窗口函数。

1 个答案:

答案 0 :(得分:2)

您可以通过执行以下操作获取SQL Server 2012+中零值的最后一行:

select top 1 t.*
from (select max(case when value = 0 then date end) over (order by date) as date0
      from t
     ) t
where date > date0 or date0 is null
order by date;

在SQL Server 2008中,您可以使用相关子查询:

select top 1 t.*
from t
where t.date > nullif((select max(date) from t t2 where t2.value = 0), '1900-01-01')
order by date;

注意:在这种情况下,NULLIF()优于COALESCE(),因为SQL Server的COALESCE()实现特别差 - 它会对第一个参数进行两次计算。