提前感谢您的帮助。我正在使用MS SQL Server 2008并尝试从Auto_Manual列中的值为“0”的第一行捕获数据,其中一行中至少有四个“0”。以下是我的数据示例:
Lot DateTimeStamp Auto_Manual rn
----------------------------------------
abc123 1/4/2017 2:08 1 1
abc123 1/4/2017 2:10 1 2
abc123 1/4/2017 2:12 1 3
abc123 1/4/2017 2:14 1 4
abc123 1/4/2017 2:16 1 5
abc123 1/4/2017 2:18 1 6
abc123 1/4/2017 2:20 1 7
abc123 1/4/2017 2:22 1 8
abc123 1/4/2017 2:24 0 1
abc123 1/4/2017 2:26 1 9
abc123 1/4/2017 2:28 1 10
abc123 1/4/2017 2:30 1 11
abc123 1/4/2017 2:32 0 2
abc123 1/4/2017 2:34 1 12
abc123 1/4/2017 2:36 1 13
abc123 1/4/2017 2:38 0 3
abc123 1/4/2017 2:40 0 4
abc123 1/4/2017 2:42 0 5
abc123 1/4/2017 2:44 0 6
abc123 1/4/2017 2:46 0 7
我正在寻找的结果是:
Lot DateTimeStamp Auto_Manual rn
----------------------------------------
abc123 1/4/2017 2:38 0 3
到目前为止,我所能做的就是获取Lot和Auto_Manual列分区的行号:
select
Lot
,DateTimeStamp
,Auto_Manual
,ROW_NUMBER() over (partition by Lot, Auto_Manual
order by DateTimeStamp) rn
from dbo.Table ) tmp
order by Lot, DateTimeStamp
对于Auto_Manual = 0或1,我能够选择rn = 1的行,但这并不是我想要做的。我只想要Auto_Manual列中有4个连续“0”的第一行。请注意,另一种方法是找到第一个Auto_Manual值“0”,其中8分钟后值仍为“0”。这只适用于中间只有“0”......
非常感谢任何帮助。
由于
答案 0 :(得分:1)
这有点难看,但它应该有效:
select * from (
select
*, last_value(RN) over (partition by GRP order by DateTimeStamp RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as LASTVAL,
row_number() over (partition by GRP order by DateTimeStamp) as RN2
from (
select *, RN - row_number() over (order by DateTimeStamp asc) GRP
from (
select
*, row_number() over (order by DateTimeStamp asc) as RN
from Table1
) X where Auto_Manual = 0
) Y
) Z where LASTVAL >= RN+3 and RN2 = 1
order by DateTimeStamp
首先对所有行进行编号,然后仅对那些有0的行进行过滤。这些行再次编号,数字之间的差异用于对它们进行分组。如果差异保持不变,则它们属于连续组。
然后使用last_value处理该组,如果最后一个值是当前行+3或更大,那么至少有4行,并且还有一个行号用于选择该组的第一行。
对于2008年,你可以这样做:
select min(DateTimeStamp)
from (
select *, RN - row_number() over (order by DateTimeStamp asc) GRP
from (
select
*, row_number() over (order by DateTimeStamp asc) as RN
from Table1
) X where Auto_Manual = 0
) Y
group by GRP
having count(*) >= 4