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

SQL :compte tous les enregistrements avec des occurrences consécutives de la même valeur pour chaque ensemble d'appareils et renvoie le nombre le plus élevé

C'est une forme de vides et d'îlots. Vous pouvez utiliser une différence de numéros de lignes pour obtenir les îles :

select device_id, speed, count(*) as num_times
from (select t.*,
             row_number() over (partition by device_id order by datetime) as seqnum,
             row_number() over (partition by device_id, speed order by datetime) as seqnum_s
      from t
     ) t
group by device_id, speed, (seqnum - seqnum_s);

Ensuite, pour en tirer le maximum, utilisez une autre couche de fonctions de fenêtre :

select device_id, speed, num_times
from (select device_id, speed, count(*) as num_times,
             row_number() over (partition by device_id order by count(*) desc) as seqnum
      from (select t.*,
                   row_number() over (partition by device_id order by datetime) as seqnum,
                   row_number() over (partition by device_id, speed order by datetime) as seqnum_s
            from t
           ) t
      group by device_id, speed, (seqnum - seqnum_s)
     ) ds
where seqnum = 1;