1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

MSQL SMS:5 kleinste Daten je Merkmal

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Jonny917, 29 August 2019.

  1. Jonny917

    Jonny917 Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
    Jonny917 gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    Jo funktioniert genauso in MSSQL.
     
    Jonny917 gefällt das.
  4. Jonny917

    Jonny917 Neuer Benutzer

    Guten Morgen Akretschmer,

    absolut genial, funktioniert einwandfrei.

    Vielen Dank & viele Grüße
    Jonny
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden