select A.MachineID,B.CrtorDT,A.Leve,A.Qty
from RoughBarLst A
INNER JOIN RoughBar B ON B.BarCode = A.BarCode
where B.CrtorDT>='2021-12-01 00:00:00' and B.CrtorDT<='2021-12-31 23:59:59'
and a.Leve IN ('A1','A2','A3')
order by a.MachineID,b.CrtorDT
上面代码得出下面表格数据
进来学习一下
你画红框的它也不是连续三天啊,是其中三天有数据,还是连续三天啊
感觉你没有说明白实际需求,结果怎么展示有要求吗?
先用递归sql准备个完整的日期列,然后取出机器和日期去重,外关联,再用开窗函数,按照完整日期列排序,根据机器分组,以当前行的上一行到下一行作为移动窗口,统计移动窗口内的非空值个数,然后取出统计值为3的记录,以此作为查询条件再去查源数据
--测试表
CREATE TABLE test_table
([MachineID] INT, [CrtorDT] datetime,[Qty] int)
;
--测试数据
INSERT INTO test_table
([MachineID], [CrtorDT],[Qty])
VALUES
(8, CONVERT(datetime, '2021-12-14 14:28:31', 20),87),
(8, CONVERT(datetime,'2021-12-14 13:28:31', 20),87),
(8, CONVERT(datetime,'2021-12-15 13:28:31', 20),87),
(8, CONVERT(datetime,'2021-12-16 13:28:31', 20),87),
(10,CONVERT(datetime, '2021-12-14 13:28:31', 20),122)
;
--查询sql
with cte as(select CONVERT(datetime, '2021-12-01', 120) d
union all
select d+1 from cte where d<=CONVERT(datetime, '2022-01-01', 120)),
c as ( select d d from cte)
, t as (
select distinct MachineID,
convert(datetime,convert(varchar(100),CrtorDT,112),20) CrtorDT,
Qty from test_table )
,
ct as (
select c.*,t.*,count(t.CrtorDT) over(partition by MachineID order by c.d rows between 1 preceding and 1 following ) x from c left join t on c.d=t.CrtorDT)
select distinct tt.* from ct , test_table tt where x=3 and ct.MachineID=tt.MachineID and tt.CrtorDT >=ct.CrtorDT-1 and tt.CrtorDT<ct.CrtorDT+2
以下为实测截图
给时间弄个条件即可,然后按照id进行分组