MSQL SMS:5 kleinste Daten je Merkmal

Jonny917

Neuer Benutzer
Beiträge
2
Hallo zusammen,

ich hoffe mir kann hier weitergeholfen werden, ich habe folgendes Problem:

Für unseren Maschinenpark, möchte ich je Maschine die 5 ältesten Aufträge anzeigen lassen.
Tabellenname: WAauftrag t1

Tabellenaufbau:
(kleiner Auszug)
MAGR AUFTRAG START ENDE
805 19AU000016 2019-01-24 04:01:00.000 2019-02-04 15:38:00.000
002 19AU000016 2018-12-04 06:00:00.000 2019-01-14 19:30:59.000
105 19AU000016 2019-01-14 19:30:59.000 2019-01-17 19:32:59.000
102 19AU000016 2019-01-17 19:32:59.000 2019-01-22 19:32:59.000
204 19AU000016 2019-01-22 19:32:59.000 2019-01-23 08:44:09.000
454 19AU000016 2019-01-23 08:54:03.000 2019-01-23 11:07:45.000
805 19AU000016 2019-01-24 04:01:00.000 2019-02-04 15:38:00.000
002 19AU000016 2018-12-04 06:00:00.000 2019-01-14 19:19:49.000
105 19AU000016 2019-01-14 19:19:49.000 2019-01-17 19:21:49.000
102 19AU000016 2019-01-17 19:21:49.000 2019-01-22 19:21:49.000
204 19AU000016 2019-01-22 19:21:49.000 2019-01-23 08:32:59.000
454 19AU000016 2019-01-23 08:43:47.000 2019-01-23 10:54:03.000
805 19AU000016 2019-01-24 04:01:00.000 2019-02-04 15:38:00.000
002 19AU000016 2018-12-04 06:00:00.000 2019-01-14 19:09:14.000

Meine Idee wäre den Befehl Top5 | order by Ende asc zu nutzen. Hier erhalte ich nur die 5 ältesten Aufträge.
Wie kann ich das je Merkmal (MAGR) machen?
Alternativ würde ich den TOP 5 Befehl je Maschinengruppe ausführen, allerdings sind das ca. 80 MAGR.

Viele Grüße und vielen Dank im voraus!
Jonny
 
Werbung:
Das ist relativ simpel. Zur Vereinfachung folgende Tabelle:

Code:
test=# create table jonny917 (gruppe int, val int);
CREATE TABLE
test=*# insert into jonny917 select * from generate_Series(1,5) g cross join (select * from generate_series(1,8)) v;
INSERT 0 40
test=*# select * from jonny917 ;
 gruppe | val
--------+-----
      1 |   1
      1 |   2
      1 |   3
      1 |   4
      1 |   5
      1 |   6
      1 |   7
      1 |   8
      2 |   1
      2 |   2
      2 |   3
      2 |   4
      2 |   5
      2 |   6
      2 |   7
      2 |   8
      3 |   1
      3 |   2
      3 |   3
      3 |   4
      3 |   5
      3 |   6
      3 |   7
      3 |   8
      4 |   1
      4 |   2
      4 |   3
      4 |   4
      4 |   5
      4 |   6
      4 |   7
      4 |   8
      5 |   1
      5 |   2
      5 |   3
      5 |   4
      5 |   5
      5 |   6
      5 |   7
      5 |   8
(40 rows)

Die val-Spalte entspricht deiner Zeitspalte. Mittels row_number() over (...) erzeuge ich je Gruppe eine Zählung der Werte dieser Spalte, sortiert nach der val-Spalte (bei Dir die Zeit-Spalte):

Code:
test=*# select gruppe, val, row_number() over (partition by gruppe order by val) from jonny917;
 gruppe | val | row_number
--------+-----+------------
      1 |   1 |          1
      1 |   2 |          2
      1 |   3 |          3
      1 |   4 |          4
      1 |   5 |          5
      1 |   6 |          6
      1 |   7 |          7
      1 |   8 |          8
      2 |   1 |          1
      2 |   2 |          2
      2 |   3 |          3
      2 |   4 |          4
      2 |   5 |          5
      2 |   6 |          6
      2 |   7 |          7
      2 |   8 |          8
      3 |   1 |          1
      3 |   2 |          2
      3 |   3 |          3
      3 |   4 |          4
      3 |   5 |          5
      3 |   6 |          6
      3 |   7 |          7
      3 |   8 |          8
      4 |   1 |          1
      4 |   2 |          2
      4 |   3 |          3
      4 |   4 |          4
      4 |   5 |          5
      4 |   6 |          6
      4 |   7 |          7
      4 |   8 |          8
      5 |   1 |          1
      5 |   2 |          2
      5 |   3 |          3
      5 |   4 |          4
      5 |   5 |          5
      5 |   6 |          6
      5 |   7 |          7
      5 |   8 |          8
(40 rows)

Nun brauche ich nur noch, wenn ich die 3 ersten Einträge je Gruppe haben will, ein Where auf die row_number - Spalte. Alles zusammen:

Code:
test=*# with temp as (select gruppe, val, row_number() over (partition by gruppe order by val) from jonny917) select gruppe, val from temp where row_number <= 3;
 gruppe | val
--------+-----
      1 |   1
      1 |   2
      1 |   3
      2 |   1
      2 |   2
      2 |   3
      3 |   1
      3 |   2
      3 |   3
      4 |   1
      4 |   2
      4 |   3
      5 |   1
      5 |   2
      5 |   3
(15 rows)

test=*#

Das war jetzt PostgreSQL, sollte nahezu gleich im M$SQL gehen.
 
Werbung:
Zurück
Oben