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

Group by oder Subselect?

Dieses Thema im Forum "Oracle" wurde erstellt von p4ran0id, 12 Juli 2013.

  1. p4ran0id

    p4ran0id Benutzer

    Hallo Leute ich hab eine Tabelle mit ID´s, Zählerständen(zv) und dem Datum(date).

    Ich möchste für eine bestimmte ID den aktuellsten Zählerstand filtern, daher dachte ich an so etwas hier:

    select zv from table
    where id=123
    and date=(select max(date) from table)

    Leider kommt bei dieser Abfrage nichts heraus und ich weiß nicht wieso.
    Meine andere alternative wäre mit einer Group By Klausel:

    Select zv, max(date) as ablesezeit from table
    where id=123
    group by zvb
    order by ablesezeit desc

    Hier bekomme ich die ID mit dem aktuellsten Zälerstand, jedoch auch noch ältere Zählerstände. Später würde ich gerne von ca. 50 ID´s jeweil den aktuellsten Zählerstand ermitteln. Was müsste ich anders tun? Ich hoffe ich bin hier im richtigen Forenteil.
    Danke schonmal.
     
  2. ukulele

    ukulele Datenbank-Guru

    Vermutlich weil das maximale Datum nicht die id 123 hat sondern eine andere. Im Umkehrschluss gibt es keinen Datensatz mit der id 123 dessen Datum dem höchsten der gesammten Tabelle entspricht.
    Du gibts in GROUP BY zvb an, nicht zv. Wenn das kein Tippfehler ist wäre das der Grund und müsste zv heissen. Eventuell hast du aber auch noch mehr Spalten wie z.B.: Ablesezeit in deiner Ausgabe so das mehrere Zeilen pro zv ausgegeben werden.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Ich würde von Oraggle erwarten, daß da ein Syntaxfehler kommt. Von daher stelle ich in Frage, daß Ora am Start ist ...
     
  4. p4ran0id

    p4ran0id Benutzer

    zvb ist ein Tipfehler
     
  5. ukulele

    ukulele Datenbank-Guru

    Und
    Select zv, max(date) as ablesezeit from table
    where id=123
    group by zv
    order by ablesezeit desc
    gibt tatsächlich mehrere identische zv Werte aus?
     
  6. p4ran0id

    p4ran0id Benutzer

    ja das ergebnis sieht dann folgendermaßen aus (habe jetzt mal die ID 533 genommen und nochmal die ID in die Ausgabe gepackt, tut aber nichts zur Sache ).

    An für sich ist das Ergebnis ja ok, aber ich will ja "nur" das aller letzte bzw. aktuellste Ergebnis haben. Und der Zählerstand ist immer mit einer ID verknüpft, deshalb verstehe ich nicht warum der Subselect nichts liefert.
     

    Anhänge:

  7. ukulele

    ukulele Datenbank-Guru

    Also GROUP BY funktioniert schon wie es soll, es gibt keine identischen zv Werte und zu jedem zv Wert wird das höchste datum ausgegeben. Wenn du jetzt nur das höchste Datum zur ID haben willst darf zv nicht unter den angezeigten Spalten sein oder muss aggregiert werden. Natürlich kann man zv auch anderweitig einbinden (das wurde in mehreren Threads die letzten Tage auch schon gemacht) aber dazu muss man natürlich entscheiden welchen zv Wert man haben will.
     
  8. p4ran0id

    p4ran0id Benutzer

    Genau, an für sich funktioniert es wie es soll, jedoch möchte ich "nur" eine Zeile ausgeben, die mit dem höchsten Datumswert.

    Da ich später mehrere ID´s suchen möchte, dachte ich an einen "IN Operator" womit ich dann bspw. ID533,123,4008 etc. in einer Liste habe mit dem aktuellsten Zählerstand. Jedoch stört mich halt bisher noch, dass alle Zählersände mit entsprechendem Datum ausgegeben werden.

    Danke für die bisherigen Antworten Leute!
     
  9. ukulele

    ukulele Datenbank-Guru

    Dann verstehe ich das Problem nicht. Such doch einfach nach:
    Select id, max(date) as ablesezeit from table
    where id IN ( 533,123,4008 )
    group by id
    order by ablesezeit desc
     
  10. p4ran0id

    p4ran0id Benutzer

    Ja weil ich ja noch den zv brauche, und sobald ich diesen dazu packe, habe ich wieder von jeder ID alle Zählerstände. Ich will für die drei ID´s jeweils den aktuellsten Zählerstand. also müssten das drei datensätze sein, jedoch sind es nun 291....weil wieder für jede ID alle bekannten Zählerstände gekommen sind.verstehst du jetzt mein problem?
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Du ermittelst erst einmal (id, max(datum)) und suchst dann alles, was Du brauchst, mit where (id,datum) in (insert your first query here)

    Also, select * from table where (select id, max(datum) from table group by id)

    Unter PG könntest Du auch DISTINCT ON nehmen, wäre einfacher, ist aber kein SQL-Standard und wird wohl in Oraggle daher nicht gehen..

    Anderer Weg wäre Einsatz von row_number(), was aber vermutlich langsamer wäre.


    Viele Wege führen zum Ziel ...
     
  12. ukulele

    ukulele Datenbank-Guru

    Dann nochmal meine Frage welchen zv du denn haben willst? Wenn es mehrere gibt muss die DB ja wissen welches der tollste ist und ich vermute mal du möchtest einen vz der das höchste datum hat und ich hoffe da gibt es immer nur einen :)
    Code:
    SELECT    t1.id,
            t2.vz,
            max(t1.date) AS ablesezeit
    FROM    tabelle t1
    LEFT JOIN tabelle t2
    ON        t1.id = t2.id
    AND        t1.date = t2.date
    WHERE    t1.id IN ( 533,123,4008 )
    GROUP BY t1.id
    ORDER BY t1.ablesezeit DESC 
     
  13. p4ran0id

    p4ran0id Benutzer

    Wie ich schon sagte, den zv mit den aktuellsten Datum. In Access habe ich es hinbekommen, dort sind es dann genau drei Zeilen, mit ID,aktuellster Zählerstand und dem Datum der letzten Ablesung. Wenn ich mir jedoch den SQL Code ausgeben lasse dann wird dort mit "LAST" gearbeitet, wüsste aber nicht dass Oracle damit arbeiten kann, denke mal dass man das mit RowID umgehen kann. Danke für eure Bemühungen.
     
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