Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当一列连续4次具有相同值时,返回值的第一行_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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

Sql 当一列连续4次具有相同值时,返回值的第一行,sql,sql-server,sql-server-2008,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 abc1

提前谢谢你的帮助。我在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的行,但这并不是我想要做的。我只想要自动手动列中有4个连续“0”的第一行。请注意,另一种方法是找到第一个自动手动值“0”,8分钟后该值仍然为“0”。这只适用于中间只有“0”的情况

任何帮助都将不胜感激


谢谢

这有点难看,但应该可以:

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的行。这些行将再次编号,并使用编号之间的差异对它们进行分组。如果差异保持不变,则它们属于连续组

然后使用最后一个_值处理该组,如果最后一个值为当前行+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

詹姆斯,非常感谢你的帮助。我应该指定我使用的是SQL Server 2008。就像last_值是2012年随附的函数一样。。我很抱歉没有将这些信息包括在OP中。有没有可能的解决方法?啊,我只看了标签。。。当然,您可以使用内部选择来替换最后一个值,但这对性能没有多大好处。一个选项是使用group by作为日期,取min,然后根据该值查找其余数据。您为2008年提供的第二个解决方案返回三个值:1/4/2017 2:24 | 1/4/2017 2:32 | 1/4/2017 2:38。因此,它看起来是正确的分组,并为每个组选择最小rn。但不幸的是,它正在为所有组选择最小值,而不仅仅是连续使用4+的组。知道这是为什么吗?对不起,忘记了最后一行,have将筛选出具有3行或更少行的组!!非常感谢你。我真的很感激。