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

MySQL - Holen Sie sich einen Zähler für jeden doppelten Wert

Leider hat MySQL keine Windowing-Funktionen, was Sie brauchen werden. Sie müssen also so etwas verwenden:

Letzte Abfrage

select data, group_row_number, overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:[email protected]+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num

siehe SQL-Geige mit Demo

Erklärung:

Erstens, innere Auswahl, dies wendet eine Schein-row_number an auf alle Datensätze in Ihrer Tabelle (siehe SQL Fiddle with Demo ). ):

select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r

Der zweite Teil der Abfrage vergleicht jede Zeile in Ihrer Tabelle mit der nächsten, um zu sehen, ob sie denselben Wert hat, wenn nicht, beginnt die group_row_number vorbei (siehe SQL Fiddle mit Demo ). ):

select data,
      @num := if(@data = `data`, @num + 1, 1) as group_row_number,
      @data := `data` as dummy, overall_row_num
from
(
  select data, @rn:[email protected]+1 overall_row_num
  from yourtable, (SELECT @rn:=0) r
) x
order by data, overall_row_num

Die letzte Auswahl gibt die gewünschten Werte zurück und bringt sie wieder in die gewünschte Reihenfolge:

select data, group_row_number, overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:[email protected]+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num