【问题标题】:How to select next value just after a particular value in SQL Server?如何在 SQL Server 中的特定值之后选择下一个值?
【发布时间】:2018-12-15 09:44:34
【问题描述】:

我想选择 stat = idle 之后的值

【问题讨论】:

  • 你能解释更多关于问题的细节吗?请以文本格式提供表格结构、示例数据和预期输出。

标签: sql sql-server partition row-number


【解决方案1】:
with cte as 
 (
    select *,
       case when lag(stat,1,'idle') over (order by time) = 'idle' -- previous row is idle
             and stat <> 'idle'                                   -- current row is not idle
            then 1
            else 0
       end as flag 
    from tab
 )
select * from cte
where flag = 1

这也返回第一行,如果要排除它,请从lag 中删除默认值。

【讨论】:

    【解决方案2】:

    您可以使用如下所示的滞后尝试以下查询

    create table #temp (id int identity (1,1), times datetime, gps_speed decimal(18,2),I2 int, stat varchar(20), row_num int)
    insert into #temp values 
    ('2018-12-14', 18.52, 1, 'running', 4),
    ('2018-12-14', 0, 1, 'idle', 5),
    ('2018-12-14', 24.08, 1, 'running', 6),
    ('2018-12-14', 37.04, 1, 'running', 29),
    ('2018-12-14', 0, 1, 'idle', 30),
    ('2018-12-14', 0, 1, 'idle', 32),
    ('2018-12-14', 18.52, 1, 'running', 37),
    ('2018-12-14', 35.19, 1, 'running', 41),
    ('2018-12-14', 16.67, 1, 'running', 42),
    ('2018-12-14', 0, 1, 'idle', 43),
    ('2018-12-14', 0, 1, 'idle', 44)    
    
    select * from (
    select 
          lag(stat, 1) OVER(ORDER BY [id]) as Prev,*
    from #temp
    )a where Prev <> stat
    and Prev = 'idle' or Prev is null
    

    输出如下图

    Prev    id  times   gps_speed           I2  stat     row_num
    NULL    1   14.12.2018 00:00:00 18,52   1   running  4
    idle    3   14.12.2018 00:00:00 24,08   1   running  6
    idle    7   14.12.2018 00:00:00 18,52   1   running  37
    

    这是现场演示 - Demo <> Prev Value

    【讨论】:

    • 您可以将 * 替换为实际的列名,即选择时间、gps_speed、I2、stat、row_num from (... 在这里找到修改后的演示 - rextester.com/WEP9020
    【解决方案3】:
            SELECT * FROM TABLE WHERE   
            ROWNUM>ANY(SELECT  
             Max(ROWNUM)
             FROM TABLE WHERE 
            STATUS='IDLE')
    

    我想这应该可以得到期望的含义,外部查询正在逐行工作,而子查询在它获得空闲状态时才返回 rownum

    【讨论】:

    • 这等价于WHERE ROW_NUM&gt;(SELECT min(ROW_NUM) FROM TABLE WHERE STATUS='IDLE'),将在row_num 5之后返回所有
    • min() 或 max() 我想为该记录获取 rownum 的 max() 会作为最终空闲的值,OP 总是需要它旁边的值,但即使我不是得到它会按需要工作还是像我的方法一样使用与核心相关的子查询为下一个 rownum 的输出提供除空闲以外的状态
    • 同意 dnoeth 试图让它一次又一次地执行相同的操作,但最终却变成了不想要的东西,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2020-05-10
    • 2022-01-11
    • 2019-03-20
    • 2011-10-04
    • 2023-04-04
    相关资源
    最近更新 更多