我有一张与此类似的表格(表格):
Date Value
20150201 5
20150205 6
20150206 0
20150207 5
20150208 0
20150209 9
20150219 7
我想在最后一次“0”出现后选择最小日期的行。在上面的例子中,最后一个0出现在20150208日期,所以我想选择它之后的行(一个日期为20150209)。日期不同。
并且,例如,如果没有值为“0”的出现,则应选择具有最小日期的行。我正在使用SQL Server 2008R2
。所以,我在这里无法使用LEAD
和LAG
窗口函数。
答案 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()
实现特别差 - 它会对第一个参数进行两次计算。