group -> min -> korrespondierenden primkey



  • Hallo, folgende Tabelle:

    tabelle
    id     datum     intervall
    1    2009-01-01      1
    2    2009-02-01      1
    3    2009-03-01      1
    4    2009-04-01      2
    5    2009-05-01      2
    6    2009-06-01      2
    7    2009-07-01      3
    8    2009-08-01      3
    9    2009-09-01      3
    

    die ist gut, da mache ich folgenden select:

    select min(datum),min(id) from tabelle group by intervall;

    da passt die id dann immer auch zum datum.
    Es kann aber durch Bearbeitung der tabelle auch passieren, dass sie so aussieht:

    tabelle
    id     datum     intervall
    1    2009-01-01      1
    2    2009-02-01      1
    3    2009-03-01      1
    4    2009-06-01      2  <- hier
    5    2009-05-01      2  <- hier
    6    2009-04-01      2  <- und hier habe ich das datum geändert
    7    2009-07-01      3
    8    2009-08-01      3
    9    2009-09-01      3
    

    jetzt liefert das select von oben nicht mehr die passende id zum datum.
    die id hätte ich aber gerne.
    wie mache ich das am besten?

    nachtrag:
    so etwas geht nicht:
    select min(a.datum as datum,b.* from tabelle a left join tabelle b on a.datum = b.datum group by a.datum;
    da in der tabelle das datum viel öfter vorkommen kann.



  • Ich verstehe dein Problem nicht.
    Die ID ist nehme ich mal an ein Autowert.
    Die beschreibt nicht den Wert des Datums sondern steht für die Zeile.
    Wenn du einen Wer tin der Zeile änderst dann ist der eben geändert.



  • Ich möchte halt auch die ID aus der Abfrage, weil ich dann weiß aus welcher Zeile das Datum kommt.

    Über die ID kann ich dann noch andere Daten aus anderen Tabellen dazujoinen.



  • select t.*
    from tabelle t
    join (
    SELECT min(id) as id
    FROM tabelle 
    GROUP BY intervall) v on t.id=v.id
    


  • hallo witte,

    das klappt leider nicht.
    mein ziel ist folgendes:
    1. Tabelle:

    1 2009-01-01
    4 2009-04-01
    7 2009-07-01

    und in der 2. tabelle soll das hier kommen

    1 2009-01-01
    6 2009-04-01
    7 2009-07-01

    mit deiner lösung klappt zwar tabelle 1, aber nicht tabelle 2, da gibts:

    1 2009-01-01
    4 2009-06-01
    7 2009-07-01



  • Sorry, mein Fehler

    select t.*
    from tabelle t
    join (
    SELECT intervall,min(datum) as datum
    FROM tabelle
    GROUP BY intervall) v on t.intervall=v.intervall and t.datum=v.datum
    


  • hallo witte,

    ja, das würde funktionieren.

    Leider ist mein minimalbeispiel nicht vollständig genug.

    Ein Join über intervall und datum wäre nicht eindeutig genug.

    Ich suche eher nach soetwas:

    select min(datum),korrespondierend(id,min(datum)) from tabelle group by intervall

    aber ich glaube das gibts nicht.



  • das geht mit den SQL Server partitioning funktionen

    du selektierst dir die row_number() für "sort by datum partition by intervall" und filterst danach auf row_number() = 1. und dafür garkein group by mehr.

    ja, das würde funktionieren.

    Leider ist mein minimalbeispiel nicht vollständig genug.

    Ein Join über intervall und datum wäre nicht eindeutig genug.

    dann bring ein ausreichend vollständiges beispiel



  • jenz schrieb:

    hallo witte,

    ja, das würde funktionieren.

    Leider ist mein minimalbeispiel nicht vollständig genug.

    Ein Join über intervall und datum wäre nicht eindeutig genug.

    Ich suche eher nach soetwas:

    select min(datum),korrespondierend(id,min(datum)) from tabelle group by intervall

    aber ich glaube das gibts nicht.

    Also so etwas wie:

    select t1.*
      from tabelle t1
      join tabelle t2
        on t1.intervall = t2.intervall
     group by t1.intervall
     having t1.datum = min(t2.datum)
    

    (ungetestet)



  • ja, eigentlich wollte ich mein beispiel ja minimal haben.
    aber da muss dann eben noch mehr rein.
    da brauche ich noch ein bisschen.
    schon mal vielen dank


Anmelden zum Antworten