Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Group de trimestres en périodes

Il s'agit d'un problème de lacunes et d'îlots. Vous pouvez le résoudre avec les fonctions de fenêtre (disponibles uniquement dans MySQL 8.0) :

select 
    person,
    min(act_date) start_date,
    max(act_date) end_date
from (
    select
        t.*,
        sum(act_date <> lag_act_date + interval 15 minute)
            over(partition by person order by act_date) grp
    from (
        select 
            t.*,
            lag(act_date) 
                over(partition by person order by act_date) lag_act_date
        from mytable t
    ) t
) t
group by person, grp
order by min(act_date)

L'idée est de constituer des groupes d'enregistrements adjacents à l'aide d'une somme cumulée :à chaque fois qu'il y a un écart qui n'est pas de 15 minutes, la somme s'incrémente.