sql统计连续相同数值的次数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql统计连续相同数值的次数相关的知识,希望对你有一定的参考价值。
查询表中(如图1 )连续2个或2个以上UUT_STATUS为Fail的项,希望查询结果为(图2)的2条结果,要怎么做?求大神赐教,谢谢!
图2:
图1:
我是新手,不是很熟悉SQL语句,求具体代码。非常感谢!!!
追答我本地没数据也不好写,这个只要会用SQL循环基本都能写出来了。
追问哦,还是不太懂。其实,只要把连续Fail的排中取最后一排并统计排数即可。
你可以模拟一下,只要实现这样的功能就行啦。万分感激。
declare @Max_Serial_number varchar(50)
declare @STRAT_DATE_TIME datetime
declare @max_STRAT_DATE_TIME datetime
declare @EXECUTION_TIME decimal(16, 13)
declare @last_STRAT_DATE_TIME datetime
declare @count int
--创建一个临时表用于存储查询结果
create table linshi([UUT_SERIAL_NUMBER] [varchar](50) NULL,
[STRAT_DATE_TIME] [datetime] NULL,
[EXECUTION_TIME] decimal(16, 13) NULL,
FAILED int,)
set @count=0
--按串行编号从小到大遍历
select @Serial_number=MIN(UUT_RESULT.UUT_SERIAL_NUMBER) FROM UUT_RESULT
select @Max_Serial_number=max(UUT_RESULT.UUT_SERIAL_NUMBER) FROM UUT_RESULT
while(@Max_Serial_number>=@Serial_number)
--按开始时间从大到小遍历
begin
select @STRAT_DATE_TIME=min(STRAT_DATE_TIME) from UUT_RESULT where UUT_SERIAL_NUMBER=@Serial_number
select @max_STRAT_DATE_TIME=max(STRAT_DATE_TIME) from UUT_RESULT where UUT_SERIAL_NUMBER=@Serial_number
while(@max_STRAT_DATE_TIME>=@STRAT_DATE_TIME)
begin
--判断状态
declare @Status varchar(10)
select @Status= UUT_STATUS from UUT_RESULT where UUT_SERIAL_NUMBER=@Serial_number and STRAT_DATE_TIME=@STRAT_DATE_TIME
--如果状态为失败,计数器累加
if(@Status='FAILED')
begin
set @count=@count+1
end
else
--状态为非失败时判断计数器结果,大于等于2的写入临时库,并重置计数器,小于2的直接重置计数器
begin
if(@count>1)
begin
insert into linshi(UUT_SERIAL_NUMBER,STRAT_DATE_TIME,EXECUTION_TIME,FAILED) select UUT_SERIAL_NUMBER,STRAT_DATE_TIME,EXECUTION_TIME,@count from UUT_RESULT where UUT_SERIAL_NUMBER=@Serial_number and STRAT_DATE_TIME=@last_STRAT_DATE_TIME
end
set @count=0
end
if(@STRAT_DATE_TIME<@max_STRAT_DATE_TIME)
begin
set @last_STRAT_DATE_TIME=@STRAT_DATE_TIME
select @STRAT_DATE_TIME=min(STRAT_DATE_TIME) from UUT_RESULT where UUT_SERIAL_NUMBER=@Serial_number and STRAT_DATE_TIME>@last_STRAT_DATE_TIME
end
else
begin
set @STRAT_DATE_TIME= '2100-12-31'
end
end
if(@count>1)
begin
insert into linshi(UUT_SERIAL_NUMBER,STRAT_DATE_TIME,EXECUTION_TIME,FAILED) select UUT_SERIAL_NUMBER,STRAT_DATE_TIME,EXECUTION_TIME,@count from UUT_RESULT where UUT_SERIAL_NUMBER=@Serial_number and STRAT_DATE_TIME=@last_STRAT_DATE_TIME
end
set @count=0
if(@Serial_number<@Max_Serial_number)
begin
select @Serial_number=MIN(UUT_RESULT.UUT_SERIAL_NUMBER) FROM UUT_RESULT where UUT_SERIAL_NUMBER>@Serial_number
end
else
begin
set @Serial_number=@Max_Serial_number+1
end
end
select * from linshi
drop table linshi追问
感谢回答!!!不知有没有简单的办法:只要把连续Fail的排中取最后一排并统计排数即可。多谢!
追答如果你的表结构里面含有唯一的标识符(比如自增的ID)那么可以通过一次循环实现,对于大量数据查询能提高一定效率。局限于我自身的知识储备,整体的查询思路我无法做出简化,整体查询思路其实并不复杂只是由于if判断较多导致篇幅过长。我把几个变量的作用给你写下,应该很快能够读明白的
@Serial_number当前的UUT_SERIAL_NUMBER
@Max_Serial_number 表中UUT_SERIAL_NUMBER的最大值,用作遍历出口
declare @STRAT_DATE_TIME当前的STRAT_DATE_TIME
declare @max_STRAT_DATE_TIME datetime当前UUT_SERIAL_NUMBER下STRAT_DATE_TIME
的最大值,用作遍历出口
declare @last_STRAT_DATE_TIME 当前查询结果的上一条数据中的STRAT_DATE_TIME值 这个非常重要因为我们在遍历到非failed数据时需要回过头查询上一条数据的STRAT_DATE_TIME和EXECUTION_TIME
declare @count int计数器,用来记录当前连续查询到了多少条failed数据 当查询到非failed数据或一条UUT_SERIAL_NUMBER下的所有数据遍历完成时需对它做清零操作。
然后整体思路:
按UUT_SERIAL_NUMBER从小到大的顺序进行循环查询;
在UUT_SERIAL_NUMBER循环中按STRAT_DATE_TIME从小到大进行循环查询;
读取每一条数据的UUT_STATUS,值为failed时计数器加1,非failed时判断当前计数器的值 大于1就将上一条数据的UUT_SERIAL_NUMBER,STRAT_DATE_TIME,EXECUTION_TIME以及计数器的值写入临时表,小于或等于1则不写入,然后计数器清零;
每一个UUT_SERIAL_NUMBER读取完之后需对最后一条数据进行判断,由于我们在每次非failed数据出现时都对计数器进行过清零操作,所以这里只需要验证计数器的值是否大于1就可以了
python代码统计字符串中大写字符小写字符特殊字符以及数值字符出现的次数
python代码统计字符串中大写字符、小写字符、特殊字符以及数值字符出现的次数
#python代码统计字符串中大写字符、小写字符、特殊字符以及数值字符出现的次数
import re
string = "Life is like a box of Chocalate,666,!!@#$"
# Creating separate lists using
# the re.findall() method.
uppercase_characters = re.findall(r"[A-Z]", string)
lowercase_characters = re.findall(r"[a-z]", string)
numerical_characters = re.findall(r"[0-9]", string)
special_characters = re.findall(r"[, .!?]", string)
print("The no. of upp
以上是关于sql统计连续相同数值的次数的主要内容,如果未能解决你的问题,请参考以下文章