Sql 当一列连续4次具有相同值时,返回值的第一行
提前谢谢你的帮助。我在MS SQL Server 2008中工作,试图从Auto_Manual列中值为“0”的第一行捕获数据,其中一行中至少有四个“0”。以下是我的数据示例: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
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行或更少行的组!!非常感谢你。我真的很感激。