当列具有相同的值4次时,返回第一行值

时间:2017-01-23 15:42:15

标签: sql sql-server sql-server-2008

提前感谢您的帮助。我正在使用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”......

非常感谢任何帮助。

由于

1 个答案:

答案 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