Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL:Zähle alle Datensätze mit aufeinanderfolgendem Vorkommen des gleichen Werts für jeden Gerätesatz und gib die höchste Anzahl zurück

Dies ist eine Form von Lücken und Inseln. Sie können eine Differenz der Zeilennummern verwenden, um die Inseln zu erhalten:

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);

Verwenden Sie dann, um das Maximum herauszuholen, eine andere Schicht von Fensterfunktionen:

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;