sql >> Database >  >> RDS >> Mysql

SQL:tel alle records met opeenvolgend optreden van dezelfde waarde voor elke apparaatset en retourneer het hoogste aantal

Dit is een vorm van gaten-en-eilanden. U kunt een verschil in rijnummers gebruiken om de eilanden te krijgen:

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

Gebruik dan, om het maximum te halen, een andere laag vensterfuncties:

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;



  1. Database reorgs – Waarom ze belangrijk zijn

  2. Ophalen van rijen toegevoegd afgelopen uur

  3. Wijzig het scheidingsteken in een komma in SQLite-queryresultaten

  4. 4 Handige Commandline-tools om MySQL-prestaties in Linux te bewaken