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

SQL-Abfrage um Datensätze auf bestimmte Zahl reduzieren?

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von delfin, 19 Januar 2017.

  1. delfin

    delfin Benutzer

    Hallo,

    bräuchte mal Hilfe bei einer SQL-Abfrage, die aus einer Datentabelle jeweils nur die 2 aktuellsten Angaben filtert. Erscheint trivial, aber ich kriegs nicht gebacken. Dazu das Beispiel:
    upload_2017-1-19_12-36-39.png

    Mit welchem SQL-Befehl könnte ich die Tabelle so reduzieren, dass ich zu jeder KuNr bei Datum nur immer die zwei aktuellsten angezeigt bekomme?

    Sag jetzt schon mal Danke für eure Hilfe!

    VG
    delfin
     
  2. akretschmer

    akretschmer Datenbank-Guru

    das normale SQL-Weg wäre ORDER BY und LIMIT. Sollte auch M$SQL können, denke ich mal.
     
  3. delfin

    delfin Benutzer

    Danke für die schnelle Hilfe,

    leider hab ich bei meinem SQL-Dialekt die Begrenzung mit LIMIT nicht. Ich kann nur z. B. auf die ersten zwei Datensätze der gesamten Tabelle reduzieren, aber dann fehlt mir der Rest. Ich müsste mit Standard-SQL sowas wie LIMIT basteln. Vielleicht hat das schon mal jemand gemacht und kann mir weiterhelfen.

    VG
    delfin
     
  4. akretschmer

    akretschmer Datenbank-Guru

    warte mal auf den @ukulele , der macht bestimmt grad Mittagsschlaf.
     
  5. ukulele

    ukulele Datenbank-Guru

    Also MSSQL macht ja nur TOP und kein LIMIT, in diesem Fall müsste man wohl PARTITION BY nutzen:
    Code:
    SELECT   t.KuNr,
         t.Datum
    FROM   (
    
    SELECT   ROW_NUMBER() OVER (PARTITION BY KuNr ORDER BY Datum) AS zeile,
         KuNr,
         Datum
    FROM   tabelle
    
         ) t
    WHERE   t.zeile <= 2
    Ist ein bischen doof weil man es schachteln muss. Vieleicht gehts auch besser (unter einer aktuellen MSSQL) aber mir fällt nix simpleres ein.
     
  6. delfin

    delfin Benutzer

    Vielen Dank,
    habe leider auch kein OVER und kein PARTITION und auch nur ROWNUM. Ich bin noch im Datenbankentwurf. Evtl. wärs einfacher und später schneller, ein separates Zählfeld (shortint) datnr für jedes Datum einzufügen, dann wäre das Problem einfach zulösen:
    SELECT KuNr, datnr, Datum
    FROM tabelle
    WHERE datnr<3

    Ich denke, wenn ich zur Auswertung eine recht verschachtelte Abfrage erstellen muss, wird die später beim Aufruf seine Zeit brauchen. Ich dachte evtl. ein Feld einsparen zu können, aber ob hier Aufwand und Ertrag im rechten Verhältnis stehen ??
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Ich glaube nicht, daß das geht. Wie sollen die N aktuellsten Einträge immer unter dieser Schwelle sein?
     
  8. ukulele

    ukulele Datenbank-Guru

    Hast du wirklich MSSQL oder MySQL? Wenn MSSQL, welche Version?
     
  9. delfin

    delfin Benutzer

    Ich hab nur SQL-92 Standard, dachte aber, dass die Sprachunterschiede nicht so groß seien.
    Ich hatte beim Lesen der Beiträge im Forum den Eindruck, dass hier wirklich Profis unterwegs sind, was sich mit euren Antworten bestätigt hat und mir zumindest zeigt, dass das Problem mit beschränktem SQL-Befehlssatz wohl doch nicht so trivial ist, wie es scheint. Die von mir oben angedachte Lösung mit dem Zusatzfeld datnr funktioniert, wenn bei jedem Speichern eines Datensatzes zunächst nach KuNR und Datum sortiert wird und dann die Sub-Menge (pro KuNr) neu durchnummeriert wird. Nachdem die Tabelle eine Detailtabelle mit dem Masterfeld KuNr sein wird, ergibt sich ohnehin jeweils auf eine KuNr beschränkte Sub-Menge. Ziel ist letztlich, dass von den Stammdaten aus gewählt werden kann, wie viele z. B. der letzten aktuellen Bestellungen man in einem Join dann sehen möchte. Ich bin aber für jeden anderen Lösungsansatz offen.
     
  10. ukulele

    ukulele Datenbank-Guru

    Also es wäre natürlich ungemein hilfreich die zugrunde liegende DB zu kennen, SQL92 sieht glaube ich kein LIMIT oder TOP vor, bin mir aber auch nicht sicher grade.

    Wie wäre es hiermit?
    Code:
    SELECT   t.KuNr,
         t.Datum
    FROM   tabelle t
    WHERE (
    
    SELECT   count(*)
    FROM   tabelle
    WHERE   tabelle.KuNr = t.KuNr
    AND     tabelle.Datum > t.Datum
    
         ) <= 1
    Allerdings wäre hier ein Index auf KuNr,Datum oder zumindest auf KuNr sicher sinnvoll bei vielen Einträgen.
     
  11. delfin

    delfin Benutzer

    Super, vielen Dank, das scheint zu funzen. Der Index ist ohnehin auf KuNr und Datum gesetzt. Dadurch müsste das auch funktionieren, wenn man <=2 oder <=3 einsetzt?
    Die zugrundeliegende DB ist ein Spezialformat, das angeblich SQL-92 kompatibel ist. Da gibt es zwar TOP aber eben nicht die von euch in MSSQL genutzten Erweiterungen.
     
  12. ukulele

    ukulele Datenbank-Guru

    Ja theoretisch muss das funktionieren, ich wüsste auch nicht, wie man das noch optimieren sollte.
     
  13. delfin

    delfin Benutzer

    Ist schon optimal! Nochmals vielen Dank.
     
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