Skip to content

Commit e7429e4

Browse files
authored
Update 19_sql-special-sort.md
1 parent 2b11cef commit e7429e4

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

implement-approach/19_sql-special-sort.md

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ inhalt:
2121
anchor: bedingung
2222
simple: ""
2323

24+
- name: "Blockweise Sortierung"
25+
anchor: block
26+
simple: ""
27+
2428
- name: "Querverweise"
2529
anchor: links
2630
simple: ""
@@ -163,6 +167,143 @@ SELECT name, date_birth FROM persons ORDER BY date_birth IS NULL DESC, name
163167
~~~
164168

165169

170+
171+
## [Blockweise Sortierung](#block)
172+
{: #block}
173+
174+
Wir haben Kunden und zu jedem Kunden mehrere Aufträge.
175+
Wir wollen uns Kunden mit den Aufträgen ausgeben lassen,
176+
jedoch soll die Ausgabe der "Kundenblöcke" so ausgegeben werden,
177+
dass der Block mit dem aktuellsten/jüngsten Datum zuerst kommt.
178+
179+
180+
Die Kunden
181+
182+
~~~ sql
183+
SELECT id, name FROM kunde
184+
185+
+----+----------+
186+
| id | name |
187+
+----+----------+
188+
| 1 | Aigner |
189+
| 2 | Gruber |
190+
| 3 | Sandmann |
191+
+----+----------+
192+
3 rows in set (0.00 sec)
193+
~~~
194+
195+
196+
Die Aufträge
197+
198+
~~~ sql
199+
SELECT id, kunde_id, produkt, deadline
200+
FROM auftrag
201+
ORDER BY deadline
202+
203+
+----+----------+--------------+------------+
204+
| id | kunde_id | produkt | deadline |
205+
+----+----------+--------------+------------+
206+
| 1 | 3 | Tisch eckig | 2017-02-01 |
207+
| 4 | 1 | Kasten | 2017-03-15 |
208+
| 7 | 2 | Gartenzaun | 2017-04-01 |
209+
| 5 | 1 | Tisch rund | 2017-04-15 |
210+
| 2 | 3 | Vitrine | 2017-05-01 |
211+
| 9 | 2 | Schreibtisch | 2017-09-01 |
212+
| 6 | 1 | Essecke | 2017-10-01 |
213+
| 8 | 2 | Carport | 2017-10-15 |
214+
| 3 | 3 | Lampe | 2018-02-01 |
215+
+----+----------+--------------+------------+
216+
9 rows in set (0.00 sec)
217+
~~~
218+
219+
220+
Ergibt "gejoint"
221+
222+
~~~ sql
223+
SELECT k.id, k.name, a.produkt, a.deadline
224+
FROM kunde k
225+
INNER JOIN auftrag a ON k.id = a.kunde_id
226+
ORDER BY deadline
227+
228+
+----+----------+--------------+------------+
229+
| id | name | produkt | deadline |
230+
+----+----------+--------------+------------+
231+
| 3 | Sandmann | Tisch eckig | 2017-02-01 |
232+
| 1 | Aigner | Kasten | 2017-03-15 |
233+
| 2 | Gruber | Gartenzaun | 2017-04-01 |
234+
| 1 | Aigner | Tisch rund | 2017-04-15 |
235+
| 3 | Sandmann | Vitrine | 2017-05-01 |
236+
| 2 | Gruber | Schreibtisch | 2017-09-01 |
237+
| 1 | Aigner | Essecke | 2017-10-01 |
238+
| 2 | Gruber | Carport | 2017-10-15 |
239+
| 3 | Sandmann | Lampe | 2018-02-01 |
240+
+----+----------+--------------+------------+
241+
9 rows in set (0.00 sec)
242+
~~~
243+
244+
245+
Um die Blöcke nach dem aktuellsten Datum sortieren zu können,
246+
brauchen wir zuerst mal das jeweils jüngste Datum der Aufträge
247+
je Kunde.
248+
249+
~~~ sql
250+
SELECT k.id, k.name, MIN(a.deadline) AS min_date
251+
FROM kunde k
252+
INNER JOIN auftrag a ON k.id = a.kunde_id
253+
GROUP BY k.id, k.name
254+
ORDER BY min_date
255+
256+
+----+----------+------------+
257+
| id | name | min_date |
258+
+----+----------+------------+
259+
| 3 | Sandmann | 2017-02-01 |
260+
| 1 | Aigner | 2017-03-15 |
261+
| 2 | Gruber | 2017-04-01 |
262+
+----+----------+------------+
263+
3 rows in set (0.00 sec)
264+
~~~
265+
266+
Nun verwenden wir diese Daten als "innere" Tabelle
267+
und joinen uns den Rest wie benötigt dazu.
268+
269+
~~~ sql
270+
SELECT
271+
k.id, k.name,
272+
a.produkt, a.deadline,
273+
sub.min_date
274+
FROM
275+
(
276+
-- frühestes deadline-datum je kunde
277+
SELECT k.id, MIN(a.deadline) AS min_date
278+
FROM kunde k
279+
INNER JOIN auftrag a ON k.id = a.kunde_id
280+
GROUP BY k.id
281+
ORDER BY min_date
282+
) sub
283+
INNER JOIN kunde k ON sub.id = k.id
284+
INNER JOIN auftrag a ON k.id = a.kunde_id
285+
ORDER BY sub.min_date, a.deadline
286+
287+
+----+----------+--------------+------------+------------+
288+
| id | name | produkt | deadline | min_date |
289+
+----+----------+--------------+------------+------------+
290+
| 3 | Sandmann | Tisch eckig | 2017-02-01 | 2017-02-01 |
291+
| 3 | Sandmann | Vitrine | 2017-05-01 | 2017-02-01 |
292+
| 3 | Sandmann | Lampe | 2018-02-01 | 2017-02-01 |
293+
| 1 | Aigner | Kasten | 2017-03-15 | 2017-03-15 |
294+
| 1 | Aigner | Tisch rund | 2017-04-15 | 2017-03-15 |
295+
| 1 | Aigner | Essecke | 2017-10-01 | 2017-03-15 |
296+
| 2 | Gruber | Gartenzaun | 2017-04-01 | 2017-04-01 |
297+
| 2 | Gruber | Schreibtisch | 2017-09-01 | 2017-04-01 |
298+
| 2 | Gruber | Carport | 2017-10-15 | 2017-04-01 |
299+
+----+----------+--------------+------------+------------+
300+
9 rows in set (0.00 sec)
301+
~~~
302+
303+
Fertig! Dies kann nun mit dem [Gruppenbruch]({{ page.root }}/jumpto/gruppenbruch/) entprechend blockweise nach Kunden ausgegeben werden.
304+
305+
306+
166307
## [Querverweise](#bedingung)
167308
{: #links}
168309

0 commit comments

Comments
 (0)