Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择最小行_Sql_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql 选择最小行

Sql 选择最小行,sql,tsql,sql-server-2008-r2,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的事件,则应选择具有最小日期的行。我正在使用SQLServer2008R

我有一张类似的桌子:

Date        Value
20150201    5
20150205    6
20150206    0
20150207    5
20150208    0
20150209    9
20150219    7
我想选择最后一次0之后的行,日期最短。在上面的示例中,最后一个0出现在日期20150208,因此我想选择它后面的一行日期为20150209。日期不同


例如,如果不存在值为0的事件,则应选择具有最小日期的行。我正在使用SQLServer2008R2。因此,我无法在此使用超前和滞后窗口函数。

您可以通过以下操作在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实现特别差-它会对第一个参数求值两次。

tnanks。但我们能不能不使用TOP呢。我已经简化了上述问题,以便简单地回答问题。实际上还有一个列ID,上面的信息是针对ID=1的。我想为每个ID返回带有上述逻辑的表。谢谢。我想出来了