SQL Statment

Advantage Database Server

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

SQL Statment

Beitrag von UliTs »

Hallo allerseits,

ich habe eine Protokolltabelle der Form: UserId,Datum,Bemerkung.
Zu jedem User kann es viele Einträge geben.
Ich möchte mit einem SELECT-Statement eine Tabelle erzeugen, die zu jedem User nur die Einträge mit dem jüngsten Datum entthält.

Beispiel
Tabelle enthält:
  • UserId,Datum,Bemerkung
    1,01.12.2010,"Viel Geschafft"
    1,02.12.2010,"Heute war's toll"
    1,02.12.2010,"Oder auch nicht"
    2,30.11.2010,"Wo bleibt mein Gehalt?"
    2,05.12.2010,"Endlich ist das Gehalt da!"
Die SQL-Tabelle soll dann enthalten:
  • UserId,Datum,Bemerkung
    1,02.12.2010,"Heute war's toll"
    1,02.12.2010,"Oder auch nicht"
    2,05.12.2010,"Endlich ist das Gehalt da!"
Wie lautet das zugehörige SQL-Statement?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Re: SQL Statment

Beitrag von thomas »

Hi Uli.

Code: Alles auswählen

SELECT UserId,Datum,Bemerkung,Count(*) from tablename group by 1,2,3 having Datum=Max(Datum)



Gruß
Thomas
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Re: SQL Statment

Beitrag von thomas »

Hi Uli.

Sry, es soll ja nur ein Datensatz pro User angezeigt werden.

Code: Alles auswählen

SELECT UserId,Datum,Bemerkung from Tablename WHERE Datum=
(SELECT max(Datum) from Tablename a where a.UserId=UserId)
Order By UserId
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL Statment

Beitrag von UliTs »

Hallo Thomas,

vielen Dank für die Tips. Beide liefern leider nicht das gewünschte Ergebnis. Das zweite habe ich etwas modifiziert, dann klappt es:

Code: Alles auswählen

SELECT TempUli.UserId,Datum,Bemerkung from TempUli, 
(SELECT max(Datum) MaxDatum,UserId from TempUli group by UserId) a
WHERE Datum=a.MaxDatum and TempUli.UserId=a.UserId
Order By a.UserId
Ich habe inzwischen folgende Lösung gefunden:

Code: Alles auswählen

SELECT          TU.*,TU2.MaxDatum 
FROM            TempUli TU
INNER JOIN      (SELECT UserId,max(Datum) MaxDatum FROM TempUli GROUP BY UserId) TU2
                ON  TU.UserId=TU2.UserId and TU.Datum=TU2.MaxDatum
ORDER BY        TU.UserId
Beide haben leider den Nachteil, dass sie nicht gerade schnell sind.
Schaut man sich den Ausführungsplan an, wird bei beiden angemeckert, dass es zur Join Condition keinen passenden Index gibt (zu UserId und Datum gibt es aber Indizes).

Wie muß der fehlende Index aussehen?
Oder wie sollte stattdessen das SQL-Statement aufgebaut sein?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL Statment

Beitrag von brandelh »

Hi,

eventuell ist es schneller die Abfrage einfacher zu machen und die gewünschten Ergebnisse in einem Array zwischenzuspeichern. ASORT und gut is ;-)
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL Statment

Beitrag von UliTs »

Hubert,

kleiner Scherz am Rand? :D

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL Statment

Beitrag von brandelh »

Nein, das habe ich ernst gemeint :!:

Es kommt natürlich drauf an, aber wenn man z.B. 100 Datensätze bei der Suche mit einfacherem Suchbegriff (UserID + etc.) bekommt,
diese in ein Array einliest und dieses Array dann manipuliert, KANN das schneller sein, als eine sehr komplexe Abfrage, die den Server schwer beschäftigt und keine passenden Indexe findet.
Du schreibst doch selbst, dass die aktuelle Lösung langsam ist.

Natürlich muss man die Datenmenge mit dem SELECT deutlich reduzieren ... oder halt mehr Indexe setzen ;-)
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL Statment

Beitrag von UliTs »

Hubert,
brandelh hat geschrieben:KANN das schneller sein, als eine sehr komplexe Abfrage, die den Server schwer beschäftigt
mit langsam meinte ich, dass es "nur" ca. 100x schneller ist als der sequentielle Zugriff. Ein Faktor von 10.000 müßte locker drin sein, wenn es die entsprechenden Indizes gibt. :-)

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten