
如何用sql查询语句统计相邻时间点不大于30分钟出现连续射中的组合的次数。2022/11/23 23:19:34-2022/11/23 23:00:45为第一组,2022/11/23 22:35:43-2022/11/23 22:20:56为第二组,2022/11/23 2:09:26-2022/11/23 2:00:25为第三组,2022/11/23 1:53:37-2022/11/23 1:00:26为第四组,一共出现四次。
描述好像有点笼统,例如:
“2022/11/23 00:50:00”与“2022/11/23 01:00:00”
“2022/11/23 01:53:37”与“2022/11/23 02:00:25”
“2022/11/23 13:01:15”与“2022/11/23 13:10:18”
“2022/11/23 14:20:00”与“2022/11/23 14:22:31”
这些不是相隔小于30分钟吗?
假设数据表名称为Temp_Check,且原没有另外顺序号列
select
ROW_NUMBER()OVER(order by 会员号 ASC,射击时间 ASC) as RowNum, --增加顺序号
会员号,射击时间,是否中靶
into #Temp_Check_Mid --暂存中间表1
from Temp_Check
GO
--创建索引
Create index IDX_Temp_Check_Mid_OperatorNo on #Temp_Check_Mid(会员号); --on Test_Data --测试文件组
Create index IDX_Temp_Check_Mid_RowNum on #Temp_Check_Mid(RowNum);
Create index IDX_Temp_Check_Mid_Time on #Temp_Check_Mid(射击时间);
GO
--查询测试
--1. 提取相邻中靶记录
select * into #Temp_Check_Mid2 --暂存中间表2
from #Temp_Check_Mid T1
where T1.是否中靶='是'
and exists
(
select 1 from #Temp_Check_Mid T2
where T1.会员号=T2.会员号
and ABS(T1.RowNum-T2.RowNum)=1 --序号相邻
and T2.射击时间 between DATEADD(second,-1800,T1.射击时间) --30分钟=1800秒
and DATEADD(second,1800,T1.射击时间)
and T1.是否中靶=T2.是否中靶 --或者 T2.是否中靶='是'
)
GO
--2. 使用游标(或其他)顺序读取中间表#Temp_Check_Mid2,若出现顺序号不连续时,次数加1