sql >> Databasteknik >  >> RDS >> Mysql

Välja grupper av på varandra följande poster med ett gemensamt attribut?

Kan du prova detta? Du kan testa här http://www.sqlfiddle.com/#!2/57967 /12 .

Select grp_new, group_concat(ord)
From (
   Select ord, if(grp = @prev, @seq, @seq := @seq + 1) as seq,
    if(grp = @prev, grp, @prev := grp) as grp_new
  From tab, (SELECT @seq := 0, @prev := '') AS init
  Order by ord
) x
Group by grp_new, seq;

Nyckelidén är att generera samma seq för samma på varandra följande grupp enligt följande.

Select
   ord, if(grp = @prev, @seq, @seq := @seq + 1) as seq,
    if(grp = @prev, grp, @prev := grp) as grp_new
From tab, (SELECT @seq := 0, @prev := '') AS init
Order by ord

sedan grupperar du slutligen GROUP BY grp, seq som kan skilja varje på varandra följande grupper även om de har samma grp .

EDIT:För att få exakt resultatet i exemplet:

Select grp_new, group_concat(ord order by ord)
From (
  Select ord, if(grp = @prev, @seq, @seq := @seq + 1) as seq,
    if(grp = @prev, grp, @prev := grp) as grp_new
  From tab, (SELECT @seq := 0, @prev := '') AS init
  Order by ord
) x
Group by seq


  1. Oracle Trigger ORA-04098:triggern är ogiltig och misslyckad omvalidering

  2. Android SQLite Journals beteende har ändrats?

  3. MySQL vs MongoDB 1000 läser

  4. Undvik sortering med Merge Join-konkatenering