Sql für zweitkleinstes Element

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Sql für zweitkleinstes Element

    Hallo,

    ich habe eine Datenbankabfrage die auf bestimmte Art gruppiert sein muss, bei Gruppierung verlier ich aber immer bestimmte Zusatzinfos mangels besseren Wissens:

    SQL-Abfrage

    1. Select min(dat) as datum, nr, sum(p.anzahl) as anzahl, sum(p.anzahl*(p.breite+2.0)) as besetzt
    2. from p
    3. Left Join k On k.id=p.id
    4. where bla
    5. Group By nr
    6. Order By datum


    Damit das mit dem Datum klappt brauche ich da eine Aggregatfunktion (z.b. Min). Jetzt ist das kleinste Datum aber ggf. in der Vergangenheit. Kann man irgendwie das zweitkleinste auch als Aggregatfunktion bekommen?
    Dann könnte ich nach Art CASE When `min(datum) in Vergangenheit` Then `nimm das nächste` CASE END das kleinste Datum in der Zukunft als Info bekommen.

    Viele Grüße

    Haudruferzappeltnoch schrieb:

    Jetzt ist das kleinste Datum aber ggf. in der Vergangenheit.
    na, wenn das nicht sein soll, formuliere doch den Where-Abschnitt entsprechend.

    Ein zweit-kleinstes oder grösstes kann man mit Sortierung und dann Top 2 erhalten.
    Also man kriegt da zwei Ergebnisse, und das zweite isses.

    Aber sind noch weitere Sql-Klimmzüge denkbar.
    Ja, denke so wie wie @ErfinderDesRades es schrieb müsste es klappen. Select Top 2 mit nem Order By Date asc/desc sollte das gewünschte Ergebniss bringen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Im where-Befehl das Datum aktuell halten kann sich noch falsch auf die anderen Spalten auswirken, in der Summe wären dann bestimmte Werte der Vergangenheit auch nicht mehr enthalten.
    Aber vielleicht ist auch das umsetzbar, da muss ich mir noch Gedanken zu machen.

    Der Top Befehl dachte ich limitert die Anzahl der Result Zeilen. Gibt es da eine spezielle Interaktion mit dem Group By?
    Denn wenn ich nach "nr" gruppiere, habe ich ja nur eine Zeile pro "nr". Insgesamt erhalte ich mit dem SQL allerdings einige Zeilen, da es einige verschiedene "nr" gibt.
    Mit Top 2 komme ich nur auf zwei verschiedene "nr", die beide aber immer noch kleinste Datum aufweisen.

    Ungruppiert klar kann ich für eine einzelne "nr" mit top 2 sortiert, das datum das ich brauche an eine bekannte Zeilenposition bringen. Da habe ich natürlich meine Summen nicht.
    Man kann im SQL auch noch weitere Felder in die Gruppierung aufnehmen.

    GroupBy Field1, Field2, Field3

    Bissl schwer zu helfen ohne das Datenmodell zu kennen.

    SQL finde ich an sich auch immer nen bissl fummelig. Ggf. tatsächlich erstmal „alle“ Daten laden und dann per VB.Net verdichten. Hast du die Daten z.b. in einer Objektliste kann man z.b. per LINQ sehr bequem Gruppierungen vornehmen. Oder manuell per Schleife durch iterieren um manuelle Gruppierungen zu bilden. Ähnliches geht sicher auch mit dem Typ. DataSet das @ErfinderDesRades als alternative vorgeschlagen hat.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ja klar das ist natürlich was ich auch gerne machen würde, aber den Code krieg ich da nie so performant hin mit Schleifen, es sind zu viele Zeilen

    LINQ dachte ich wäre ganz ähnlich zu SQL abfragen.

    Ich habe hier ein Beispiel in Excel erstellt.
    Dateien
    • testdaten.xlsx

      (9,21 kB, 40 mal heruntergeladen, zuletzt: )
    Gruppiere es im SQL nach Nr und Datum. Dann kannst diese Daten per VB.Net Code zusätzlich analysieren und bzgl. des Datums entsprechend Dinge tun.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen