Max-Wert u. Datum in separaten Spalten anzeigen

kraeppus

Benutzer
Beiträge
10
hallo zusammen,

bei einer abfrage kriege ich folgende Tabelle:

Datenname [varchar], Tarif1 [float], Tarif2[float], Tarif3[float], Zeit_Tarif1[datetime], Zeit_Tarif2[datetime], Zeit_Tarif3[datetime], ...

mein problem ist hier, dass ich 6 weitere spalten brauche, in denen der maximalwert von tarif1/2/3 mit dem zugehörigen datum ausgegeben wird.

zuerst dachte ich mir, dass ich als letztes dann Max(Wert_Tarif1) selektiere, aber es kommt die fehlernachricht:
Meldung 8120, Ebene 16, Status 1, Prozedur PD_EA_Bericht_LeistungsMonatsWerte, Zeile 4
Die Datenherkunft.Daten_Name-Spalte ist in der Auswahlliste ungltig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.

ich bin mir unsicher, ob ich alle spalten, die ich in der selekt-anweisung stehen habe, dann vor dem order by noch in einer group-anweisung auflisten muss?

ich bin leider kein sql-guru und stehe auf dem schlauch -.-

danke im voraus :)

lg
kraeppus
 
Werbung:
Das stimmt schon, alle Spalten müssen entweder im GROUP BY genannt werden oder aggregiert werden. Da du auch Datum und Zeit ausgeben würdest wäre das in deinem Fall vermutlich wenig zweckdienlich, das kann ich aber nur schlecht beurteilen ohne Beispieldaten.
 
Und der maximal Wert von z.B. Tarif 1 soll jetzt in jeder Zeile als zusätzliche Spalte stehen oder willst du nur alle Maximalwerte in einer Spalte stehen haben? Sind die Maximalwerte von anderen Faktoren abhängig, also müssen sie z.B. im selben Monat wie die ausgewählten Datensätze liegen?
 
Das wären die Spalten die du hinzufügen müsstest (in Oracle-Syntax)
Code:
Max(wert_tarif1) over(partition by DEIN_PK) as max_t1,
max(zeit_tarif1) keep(dense_rank first partition by DEIN_PK order by wert_tarif1 desc) as datum_t1
 
@ukulele
ja genau, der wert hängt vom Monat und vom jahr ab. habe erstmal mit dem gezeigten Beispielsatz rumexperimentiert und ganz vergessen, dass in der abfrage auch andere Monate und jahre vorkommen können -.-

und ich arbeite mit t-SQL, leider nicht mit pl/SQL
trotzdem danke @Distrilec
 
Ich würde das einfach dazu joinen, hier mal beispielhaft:
Code:
SELECT    t0.fk_unt,
        t0.datum,
        t2.datum AS datum_max
FROM    unt_log t0
LEFT JOIN (    SELECT    t1.fk_unt,
                    datepart(yyyy,t1.datum) AS jahr,
                    datepart(mm,t1.datum) AS monat,
                    max(t1.datum) AS datum
            FROM    unt_log t1
            GROUP BY t1.fk_unt,datepart(yyyy,t1.datum),datepart(mm,t1.datum) ) t2
ON        t0.fk_unt = t2.fk_unt
AND        datepart(yyyy,t0.datum) = t2.jahr
AND        datepart(mm,t0.datum) = t2.monat
 
Und dann lässt du mal ein Explain drüber laufen und versuchst das mal für 10.000.000 Datensätze... "einfach dazu joinen" funktioniert vllt. heute, aber wahrscheinlich nicht mehr morgen.

Analytic Functions gibt es nicht umsonst... Du machst hier nämlich 2mal einen Full Table-Scan über die gleiche Tabelle, was einfach unnötig ist.
 
Werbung:
@Distrilec ich werde deinen code in transact überestzen :) kannte 'over' vorher noch net, da werde ich mich mal mit auseinandersetzen.
@ukulele danke für die Idee des "dazu joinens" allerdings hat die Tabelle noch 5mio mehr datensätze, als @Distrilec als Beispiel anführte...

schöne restwoche ;)
 
Zurück
Oben