add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
select version();
version()
8.0.36
CREATE TABLE intervals (
num int,
valid_from datetime,
valid_until datetime
);

INSERT INTO intervals
(num, valid_from, valid_until)
values
row (1, '2024-07-23 09:21:17', ADDDATE('2024-07-23 09:21:17', 7)),
row (2, ADDDATE('2024-07-23 09:21:17', 1), ADDDATE('2024-07-23 09:21:17', 8)), -- should be this valid_until date as starting
row (3, ADDDATE('2024-07-23 09:21:17', 2), ADDDATE('2024-07-23 09:21:17', 9)),
row (4, ADDDATE('2024-07-23 09:21:17', 3), ADDDATE('2024-07-23 09:21:17', 10)),
row (5, ADDDATE('2024-07-23 09:21:17', 20), ADDDATE('2024-07-23 09:21:17', 27)),
row (6, ADDDATE('2024-07-23 09:21:17', 20), ADDDATE('2024-07-23 09:21:17', 27)),
row (7, ADDDATE('2024-07-23 09:21:17', 20), ADDDATE('2024-07-23 09:21:17', 27))
;
select * from intervals;
Records: 7  Duplicates: 0  Warnings: 0
num valid_from valid_until
1 2024-07-23 09:21:17 2024-07-30 09:21:17
2 2024-07-24 09:21:17 2024-07-31 09:21:17
3 2024-07-25 09:21:17 2024-08-01 09:21:17
4 2024-07-26 09:21:17 2024-08-02 09:21:17
5 2024-08-12 09:21:17 2024-08-19 09:21:17
6 2024-08-12 09:21:17 2024-08-19 09:21:17
7 2024-08-12 09:21:17 2024-08-19 09:21:17
with allevents as(
select num,dt,running,sum(running)over(order by dt)qty
,row_number()over(order by dt) rn
from(
select num,valid_from dt, 1 running
from intervals
union all
select num,valid_until, -1 running
from intervals
)x
)
,t as(
select *
,sum(newgr)over(order by dt)grn
from(
select num,dt,running,qty,rn
,case when qty>=3 and lag(qty,1,0)over(order by dt)<=2
or qty<=2 and lag(qty,1,0)over(order by dt)>=3
then 1 else 0 end newgr
from allevents
)running_qty
)
select *
from t
-- where qty<3 and maxnext<3
order by dt
-- limit 1

num dt running qty rn newgr grn
1 2024-07-23 09:21:17 1 1 1 0 0
2 2024-07-24 09:21:17 1 2 2 0 0
3 2024-07-25 09:21:17 1 3 3 1 1
4 2024-07-26 09:21:17 1 4 4 0 1
1 2024-07-30 09:21:17 -1 3 5 0 1
2 2024-07-31 09:21:17 -1 2 6 1 2
3 2024-08-01 09:21:17 -1 1 7 0 2
4 2024-08-02 09:21:17 -1 0 8 0 2
5 2024-08-12 09:21:17 1 3 9 1 3
6 2024-08-12 09:21:17 1 3 10 0 3
7 2024-08-12 09:21:17 1 3 11 0 3
5 2024-08-19 09:21:17 -1 0 12 1 4
6 2024-08-19 09:21:17 -1 0 13 0 4
7 2024-08-19 09:21:17 -1 0 14 0 4
with allevents as(
select num,dt,running,sum(running)over(order by dt)qty
,row_number()over(order by dt) rn
from(
select num,valid_from dt, 1 running
from intervals
union all
select num,valid_until, -1 running
from intervals
)x
)
,t as(
select *
,sum(newgr)over(order by dt)grn
from(
select num,dt,running,qty,rn
,case when qty>=3 and lag(qty,1,0)over(order by dt)<=2
or qty<=2 and lag(qty,1,0)over(order by dt)>=3
then 1 else 0 end newgr
from allevents
)running_qty
)
,grint as(
select grn,min(rn)n1,max(rn)n2
,min(dt)fromdt,max(dt) todt
,min(qty)qtymin,max(qty) qtymax
,lead(min(dt))over(order by grn) nextgrdt
,case when adddate(min(dt),7)<lead(min(dt))over(order by grn)
or lead(min(dt))over(order by grn) is null
then 1 else 0 end slot
-- ,timediff(nextEvent,dt) td
from t
group by grn
)
-- select * from grint order by grn;

fromdt nextgrdt
2024-07-31 09:21:17 2024-08-12 09:21:17
2024-08-19 09:21:17 null