2009-06-20 4 views
6

ich einige Daten wie diese haben aber mehr als 1,5 Millionen Datensätze und mehr als 700 Benutzer:deutliche Wählen Sie aus usercolumn und Minimalwert der Daten für jedes Feld in usercolumn

usercolumn ,  datecolumn\  
a1   ,  1998/2/11\ 
a2   ,  1998/3/11\ 
a1   ,  1998/2/15\ 
a4   ,  1998/4/14\ 
a3   ,  1999/1/15\ 
a2   ,  1998/11/12\ 
a2   ,  1999/2/11\ 
a3   ,  2000/2/9\ 
a1   ,  1998/6/5\ 
a3   ,  1998/7/7\ 
a1   ,  1998/3/11\ 
a5   ,  1998/3/18\ 
a2   ,  1998/2/8\ 
a1   ,  1998/12/11\ 
a4   ,  1998/12/1\ 
a5   ,  1998/2/11\ 
.... 

Ich möchte von usercolumn verschiedene Daten haben und Minimalwert von Datum für jeden Benutzer wie folgt aus:

usercolumn  , datecolumn \   
a1    , 1998/2/11\ 
a2    , 1998/2/8\ 
a3    , 1998/7/7\ 
a4    , 1998/4/14\ 
a5    , 1998/2/11\ 
.... 

bitte helfen Sie mir einen SQL-Befehl zu schreiben, dies in C# für oledb Adapter zu tun, danke.

+0

@ dmitri Antwort (einmal nach meinem Kommentar behoben) ist in Ordnung für das Problem, das Sie angeben, aber ich vermute, Sie falsch angegeben das Problem: Insbesondere wenn Sie andere Spalten haben, müssen Sie Ein anderer Ansatz. –

Antwort

0

So etwas wie dies die Zecke

SELECT usercolumn 
     , MIN(datecolumn) 
     FROM YouTable 
    GROUP BY usercolumn 
     , MIN(datecolumn) 
+0

"SQL-Fehler: Aggregatfunktionen sind in der GROUP BY-Klausel nicht erlaubt" (zumindest von anständigen SQL-Engines! -). Entferne einfach die letzte Zeile, die Gruppierung nach min (Datumsspalte) macht keinen Sinn und die Antwort ist ohne sie in Ordnung! -) –

+0

Entschuldigung. Nur falsche Typen. Danke für die Korrektur. –

0

Wenn Sie mehr als nur diese zwei Spalten tun soll, ist die beste SQL auf ein bisschen zu verwenden, hängt welchem ​​Server Sie am anderen Ende dieses OleDB Adapter haben, aber hier ist etwas, das gut funktionieren wird mit vielen (leider nicht alle!) solche möglichen Servern:

SELECT t.* 
FROM thetable t 
LEFT JOIN thetable taux 
    ON(t.usercolumn=taux.usercolumn 
    AND t.datecolumn>taux.datecolumn) 
WHERE taux.usecolumn IS NULL 

, die Sie als „emittieren die Zeilen von thetable so lesen konnte, dass es keine andere Zeile der Tabelle mit der ist gleicher Benutzer und ein striktes Datum ". Wenn das Mindestdatum für einen bestimmten Benutzer mehrmals vorkommen kann, werden für diesen Benutzer so viele Zeilen angezeigt. Wenn das ein Problem für Sie ist, gibt es auch Lösungen dafür ... aber ich warte auf Sie, um Ihre Frage zu klären mehr, bevor ich auf diese nicht mehr arbeiten -)

2

Dies wird für SQL Server 2008 und DB2 arbeiten:

with temp as (
    select *, row_number() over (partition by usercolumn order by datecolumn) as rownum 
    from table) 
select * from temp 
where rownum = 1 

Es wird die richtigen Ergebnisse liefern, auch wenn Sie mehrere Spalten in der Auswahl aufnehmen müssen.

20
SELECT usercolumn, MIN(datecolumn) FROM tablename GROUP BY usercolumn; 

Beachten Sie, dass, wenn Sie andere Spalten möchten, sie entweder in der GROUP BY-Klausel oder in den Zeilen konstant sein müssen. Andernfalls wird das Ergebnis nicht deterministisch sein.

+0

+1 Die einfachste und richtige Antwort – gbn

+0

arbeitete für mich, thx – 5er

+0

endlich, nach stundenlanger Suche. Vielen Dank –

0

könnten Sie dies versuchen:

SELECT DISTINCT a.username, a.date 
FROM tablename AS a INNER JOIN tablename AS b 
ON(a.username = b.username AND a.date < b.date) 

Wie für C#, kann nicht helfen Sie dort

0

DISTINCT NUTZERNAME SELECT, DATE FROM Tabellenname ALS WHERE A.DATE = (SELECT MIN (DATE) FROM TABLENAME WHERE USERNAME = A.USERNAME)

Verwandte Themen