匿名用户
您可以使用窗口函数。其思想是使用窗口和创建相邻记录组,该窗口和每次两个连续记录之间的差异超过30分钟时递增。select data, min(dt) start_dt,max(dt) end_dt, count(*) cnt
from (
select
t.*,
sum(lag_dt is not null and dt > lag_dt + interval 30 minute)
over(partition by data order by dt) grp
from (
select
t.*,
lag(dt) over(partition by data order by dt) lag_dt
from (
select t.*, concat(date, ' ', time) dt
from mytable t
) t
) t
) t
group by data, grp
order by min(dt)
请注意,将日期和时间存储在两个单独的列中不是一个好的做法;我添加了额外的嵌套级别来生成datetime值。
我们可以用日期算术消除一个级别的嵌套(这里,间隔必须正好是30分钟):select data, min(dt) start_dt,max(dt) end_dt, count(*) cnt
from (
select
t.*,
row_number() over(partition by data order by dt) rn
from (
select t.*, concat(date, ' ', time) dt
from mytable t
) t
) t
group by data, dt - interval (rn * 30) minute
order by min(dt)