SQL: Erstellen einer festen Anzahl von Datensammlungen
Aus DBWiki
Anders als in Erstellen von gleich großen Datensammlungen ist hier die Anzahl der Gruppen fest vorgegeben. Mittels Self-Join, Zählen der Datensätze und Modulus-Operation darauf, lässt sich die Zuordnung vornehmen. In SQL-Dialekten mit Window Funktionen kann die ntile()-Funktion verwendet werden.
Es sollen z.B. alle Mitarbeiter gleichmäßig auf 4 Gruppen verteilt werden.
Lösung für Jet-SQL
Hinweis für Access-Anwender
Um die folgenden Abfragen selbst testen zu können, müssen die Tabellen der Übungsdatenbank vorhanden sein.
SELECT ( Count( * ) + 3 ) Mod 4 + 1 AS gruppe, m0.ma_nr, min( m0.ma_name ) AS ma_name FROM mitarbeiter AS m0, mitarbeiter AS m1 WHERE m0.ma_nr <= m1.ma_nr GROUP BY m0.ma_nr ORDER BY 1, 2
Der Offset von 3 bei Count(*) dient nur dazu, dass die Gruppen mit den niedrigsten Werten zuerst aufgefüllt werden.
Lösung mittels ntile()
SELECT ntile( 4 ) OVER ( ORDER BY ma_nr ) AS gruppe, ma_nr, ma_name FROM mitarbeiter
Die Lösung kann in diesem DBFiddle eingesehen werden.
gruppe | ma_nr | ma_name |
---|---|---|
1 | 7499 | Allard |
1 | 7698 | Blank |
1 | 7844 | Dreher |
1 | 7934 | Müller |
2 | 7369 | Schmidt |
2 | 7654 | Mertens |
2 | 7839 | König |
2 | 7902 | Fuhrmann |
3 | 7566 | Johann |
3 | 7788 | Scheidt |
3 | 7900 | Jakobs |
4 | 7521 | Wecker |
4 | 7782 | Kühne |
4 | 7876 | Adam |