sql >> Database >  >> RDS >> Mysql

Selecteer bij waardeverandering

Dit is een soort van gaps-and-islands-probleem. Eilanden zijn aangrenzende rijen met hetzelfde batchnum , en je wilt het begin van elk eiland.

Hier is de eenvoudigste aanpak waarschijnlijk lag() :

select *
from (
    select e.*,
        lag(batchnum) over(order by time) lag_batchnum
    from example e
) e
where not lag_batchnum <=> batchnum

Merk op dat hiervoor MySQL 8.0 vereist is. In eerdere versies gebruikt één alternatief een gecorreleerde subquery:

select e.*
from example e
where not batchnum <=> (
    select e1.batchnum
    from example e1
    where e1.time < e.time
    order by e1.time desc
    limit 1
)

Hier is een demo op DB Fiddle .




  1. Maak een nieuwe tabel in de bestaande DB in een aparte SQLiteOpenHelper-klasse

  2. Python, MySQL _mysql_exceptions.ProgrammingError:(1064, 'U heeft een fout in uw SQL-syntaxis

  3. ORA-00918:kolom dubbelzinnig gedefinieerd in SELECT *

  4. mysql5.58 unstart server in mac os 10.6.5