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

delfin

Benutzer
Beiträge
6
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
 
Werbung:
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
 
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.
 
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 ??
 
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.
 
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.
 
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.
 
Werbung:
Zurück
Oben