sql >> Databasteknik >  >> RDS >> Mysql

SQL:räkna alla poster med på varandra följande förekomst av samma värde för varje enhetsuppsättning och returnera det högsta antalet

Detta är en form av luckor-and-öar. Du kan använda en skillnad på radnummer för att få öarna:

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

Använd sedan ett annat lager med fönsterfunktioner för att få max:

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. Hur ändrar jag en PostgreSQL-tabell och gör en kolumn unik?

  2. Hierarkiska frågor i SQL Server 2005

  3. Charlotte SQL Server User Group:Fixa långsamma frågor. Snabb.

  4. Mysql-händelsefel med php