首页 > 解决方案 > SQL 选择值更改的行

问题描述

我有一张这样的桌子:

id     |   diameter
___________________
100    |     5.0             
101    |     5.0                      
102    |     3.0             
103    |     3.0         
104    |     3.0         
105    |     6.0       
106    |     6.0

 

SELECT a.* FROM tableX AS a WHERE a.diameter <> ( SELECT TOP 1 b.diameter FROM tableX AS b WHERE a.id > b.id ORDER BY b.id )             

我需要查询来向我显示直径发生变化的位置的 ID。在这个例子中,我需要它来显示 id 102 和 id 105

标签: sqlsql-serversql-server-2008

解决方案


您想lag()在 SQL Server 2012+ 中使用:

select t.*
from (select t.*, lag(t.diameter) over (order by t.id) as prev_diameter
      from t
     ) t
where prev_diameter <> diameter;

在 SQL Server 2008 中,相关子查询 orapply可以工作:

select t.*
from t cross apply
     (select top (1) t2.*
      from t t2
      where t2.id < t.id
      order by t2.id desc
     ) tprev
where tprev.diameter <> t.diameter

推荐阅读