Brauche Hilfe bei folgender SQL-Query

  • Hi!

    Also meine SQL-Fähigkeiten sind schon arg eingerostet, darum bitte ich euch um Rat ob/wie mein Problem in einer SQL-Abfrage umgesetzt werden kann.

    Die Tabelle sieht folgendermaßen aus:

    ---- DATUM ------------- CT_ID ----- ID ----- NAME ----- HID
    -----------------------------------------------------------------
    #1- 13.3.2006 17:25:00 -- 241 ------- 1 ----- Name01 ---- H1
    #2- 13.3.2006 17:26:00 -- 242 ------- 2 ----- Name02 ---- H1
    #3- 13.3.2006 17:30:00 -- 242 ------- 3 ----- Name02 ---- H1
    #4 -13.3.2006 17:34:00 -- 200 ------- 4 ----- Name03 ---- H2
    -----------------------------------------------------------------

    Die Abfrage soll folgendes liefern:
    Das Ergebnis der Query soll Tupel Nummer 1 und Tupel Nummer 3 sein.

    Die erste Bedingung ist, dass HID = H1 sein soll.
    Tupel 4 fällt durch "WHERE HID = H1" weg, so weit so gut.
    Tupel 2 soll dadurch wegfallen, da es 2 Tupel gibt, welche
    die gleiche CT_ID haben (CT_ID = 242 bei Tupel 2 & 3). In diesem Falle soll nur jenes Tupel geliefert werden, dessen Datum "später bzw. größer" ist (--> da 17:30 > 17:26 fällt somit Tupel 2 auch weg).

    Ist das so ca. klar bzw. verständlich beschrieben?
    Ist das in einer SQL-Query gscheit lösbar?

    Mein Without-SQL-Workaround-Schmäh wäre, dass ich per SQL einfach nur anhand der HID filtere (also wieder kill Tupel 4) und dann absteigend nach Datum sortiere. Das gelieferte ResultSet würde ich dann einfach in einer Schleife durchlaufen und die Results in eine Collection umfüllen, wobei ich mir aber merke welche CT_ID's schon verwendet wurden (schon verwendet --> skip).

    Der Ablauf wäre also:
    Schau nach ob CT_ID 242 schon vorhanden ist.
    Nein: --> ADD Tupel #3
    Schau nach ob CT_ID 242 schon vorhanden ist.
    Ja: --> Skip Tupel #2
    Schau nach ob CT_ID 241 schon vorhanden ist.
    Nein: --> ADD Tupel #1
    Dieser Weg wäre aber wohl sicher etwas unperformant :o

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Öha, falsches Subforum *movemyself*

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • in einer form, die (hoffentlich!) alle sql-server verstehen:

    Code
    create view bla as select max(datum) as datum, ct_id, hid from tabelle group by hid, ct_id;
    
    
    select * from tabelle t, bla b where t.datum=b.datum and t.ct_id=b.ct_id and t.hid=c.hid and c.hid='H1';

    aaaalso: die view "bla" liefert eine liste aller kombinationen von HID und CT_ID mit jeweils dem spätesten datum; das SELECT-statement führt schließlich einen natural join der view mit der tabelle selbst durch, um für die ausgewählten tupel auch die attribute aus der tabelle zu erhalten, welche die view nicht liefert (wenn du diese attributwerte nicht brauchst, kannst du das select-statement natürlich kübeln und von der view nur das select-statement übriglassen).

    ich hab die bezeichnung tabelle genommen für jene tabelle, in welcher sich die abzufragenden daten befinden. weiters weiß ich nicht, was primärschlüssel der tabelle ist, daher ggf. die where-klausel anpassen

    natürlich kannst du die view als auch subselect in das select-statement reinziehen, wenn das dein verwendeter SQL-server kann. statt den drei bedingungen in der where-klausel kannst du auch "tabelle t natural join bla b" schreiben, natürlich wieder unter der bedingung, dass der SQL-server das kann.

    ich hoffe, das funktioniert so :shinner:

  • Zitat von AntiBit

    Hi!
    Das Ergebnis der Query soll Tupel Nummer 1 und Tupel Nummer 3 sein.

    select * from tabelle t1 where hid = "H1" and datum >= (select max(datum) from tabelle t2 where t1.ct_id = t2.ct_id)

  • *lol* Sag nicht SQL-Server, wir reden hier von Access :shinner:

    Danke, ich werde das gleich mal probieren und Meldung erstatten.

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

  • Zitat von Spockman

    select * from tabelle t1 where hid = "H1" and datum >= (select max(datum) from tabelle t2 where t1.ct_id = t2.ct_id)

    imho musst du t1.hid und t2.hid auch noch auf gleichheit überprüfen, also

    Code
    select * from tabelle t1 where hid = "H1" and datum >= (select max(datum) from tabelle t2 where t1.ct_id = t2.ct_id and t1.hid = t2.hid)
  • Also erstmal Danke an euch beide, der SQL-String von Spockman scheint einwandfrei zu funktionieren. :thumb:

    Mei, so schnell vergisst man, Datenbanksysteme ist lang her...

    Hätten uns Spiele wie Pac-Man in unserer Jugend beeinflusst, würden wir heute durch dunkle Räume irren, elektronische Musik hören und Pillen fressen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!