【发布时间】:2018-12-15 09:44:34
【问题描述】:
【问题讨论】:
-
你能解释更多关于问题的细节吗?请以文本格式提供表格结构、示例数据和预期输出。
标签: sql sql-server partition row-number
【问题讨论】:
标签: sql sql-server partition row-number
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 中删除默认值。
【讨论】:
您可以使用如下所示的滞后尝试以下查询
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
【讨论】:
SELECT * FROM TABLE WHERE
ROWNUM>ANY(SELECT
Max(ROWNUM)
FROM TABLE WHERE
STATUS='IDLE')
我想这应该可以得到期望的含义,外部查询正在逐行工作,而子查询在它获得空闲状态时才返回 rownum
【讨论】:
WHERE ROW_NUM>(SELECT min(ROW_NUM) FROM TABLE WHERE STATUS='IDLE'),将在row_num 5之后返回所有行