/ / Nummerierung von SQL-Abfrageergebnissen basierend auf Gruppierungen [closed] - mysql, sql, select

SQL-Abfrageergebnisse basierend auf Gruppierungen nummerieren [geschlossen] - mysql, sql, select

Ich habe eine Tabelle mit jeweils vielen DatenzeilenDavon ist ein Abschnitt zugeordnet, der aus einem Buchstaben und einer Ziffer besteht (z. B. A.1). Ich muss alle Daten aus dieser Tabelle abrufen und nach dieser Gliederung sortieren. Beim Abrufen dieser Daten wurde ich angewiesen, eine neue Spalte zu generieren, die jede Zeile in diesem Abschnitt nummeriert, wodurch Unterabschnitte erstellt werden (z. B. A.1.1, A.1.2).

Zum Beispiel eine Datengruppe mit "Abschnitten"Eine Tabelle mit 2 Abschnitten A.1, B.1. Ich möchte in der Lage sein, jedes dieser Ergebnisse in einer zusätzlichen Spalte "SubNumber" 1, 2, 3 usw. zu nummerieren. Wenn die Zeile ein neuer Abschnitt ist, muss diese Nummerierung neu gestartet werden.

Bedeutet eine Tabellenergebnismenge wie folgt:

Data    | Section | SubNumber
_______________________
record1 | A.1     | 1
record2 | A.1     | 2
record3 | A.1     | 3
record4 | B.1     | 1
record5 | B.1     | 2

Ich habe in SQL versucht, diese SubNumber im laufenden Betrieb zu erstellen, und bin dem nicht nahe gekommen.

Irgendwelche Gedanken?

Antworten:

2 für die Antwort № 1

Sie können dies mit Variablen tun:

  select t.*,
(@rn := if(@s = Section, @rn + 1,
if(@s := Section, 1, 1)
)
) as SubNumber
from table t cross join
(select @rn := 0, @s := "") vars
order by Section;

Das Problem hier ist, dass die Nummerierung ist willkürlich innerhalb einer Gruppe. Sie müssen eine Möglichkeit haben, die Zahlen anzugeben. Wenn Sie sich dafür entscheiden, fügen Sie diese Spalte in das Feld ein order by.


0 für die Antwort № 2

Verwenden einer Benutzervariable zum Hinzufügen der Folgenummerist möglich, aber ein häufiges Problem ist die Reihenfolge, in der sich die Daten befinden, wenn die Sequenznummer angewendet wird (und nicht, wenn die Abfrage abgeschlossen ist). Die Lösung hierfür besteht darin, die Daten in einer Unterabfrage mit einer order by-Klausel abzurufen und anschließend die Folgenummer hinzuzufügen.

SELECT sub0.Data, sub0.Section, @seq = if(Section = @section, @seq + 1, if (@Section := section, 1, 1))
(
SELECT Data, Section
FROM sometable
ORDER BY Section, Sequence, LibraryOpNumber
) sub0
CROSS JOIN
(
SELECT @section:="", @seq:=0
) sub1