5 Stimmen

SQL-Gruppe nach Problem

Ich habe eine Abfrage, die eine Reihe von Verknüpfungen und hat ein paar Kriterien in der WHERE-Klausel, und ich bin am Ende mit einem Ergebnis, das im Wesentlichen wie folgt aussieht:

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2008-01-01 |  different |
|      1 | 2009-01-01 |       info |
|      1 | 2010-01-01 |        for |
|      2 | 2008-01-01 |       each |
|      3 | 2008-01-01 |        row |
|      3 | 2009-01-01 |       here |

Im Wesentlichen gibt es also für jeden Benutzer ein oder mehrere Daten in der Vergangenheit und 0 oder mehrere Daten in der Zukunft.

Ich muss den Datensatz irgendwie auf eine Zeile pro Benutzer reduzieren, nur die Zeile mit dem zuletzt abgelaufenen Datum auswählen . Das heißt, mit welcher Magie auch immer GROUP BY o HAVING Klausel hinzugefügt wird, würde das obige Ergebnis wie folgt aussehen:

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2009-01-01 |       info |
|      2 | 2008-01-01 |       each |
|      3 | 2009-01-01 |       here |

5voto

Roee Adler Punkte 32367

Ich denke, dass Sie GROUP BY / HAVING nicht verwenden möchten, weil Sie an genau einer Zeile pro Benutzer interessiert sind und diese Zeile bereits in der Tabelle vorhanden ist. Dies erfordert eine WHERE-Klausel und nicht GROUP BY / HAVING.

Ich schlage vor, dass Sie in der WHERE-Klausel eine Bedingung hinzufügen, dass das Datum gleich dem Ergebnis einer Unterabfrage sein muss. Diese Unterabfrage sollte:

  1. Wählen Sie das max(Datum)
  2. eine WHERE-Klausel haben, die das Datum auf einen Wert kleiner als NOW begrenzt
  3. Verfügen Sie über eine WHERE-Klausel mit UserID gleich der Benutzerkennung der äußeren Abfrage

Um zu verhindern, dass ein bestimmter Benutzer zwei Einträge mit demselben Datum hat, das auch das maximale "vergangene" Datum ist, sollten Sie auch DISTINCT hinzufügen.

Ich hoffe, das hilft.

0voto

March Punkte 635

Zum Beispiel so:

select a.userId, a.date, b.userId, b.otherData
from table1 as a 
left outer join table2 as b on a.userId = b.userId
where b.Id in (
    select top 1 Id from table2 as c where c.userId = a.userId)

0voto

Eugene Punkte 2935
Select 
  userID, date, otherData 
from 
  yourTable t1
where 
  date = 
    (select max(date) from yourTable t2
     where t1.userID=t2.userID)

0voto

Cătălin Pitiș Punkte 13785
select T.userid, T.date, T.otherdata 
from 
    T, 
    (select userid, max(date) max_date from T group by userid) GT
where 
    T.userid = GT.userid and T.date = GT.max_date

Erläuterung: Inner select - nur die Datensätze mit dem maximalen Datum für jeden Benutzer auslesen. entire select - Verknüpfung der ausgelesenen Datensätze mit der Originaltabelle, um das Feld "otherdata" zu erhalten.

Ich habe angenommen, dass es nur ein maximales Datum für eine Benutzerkennung gibt. Bitte sagen Sie mir, ob dies die richtige Annahme ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X