2009-06-20 8 views
6

ho alcuni dati come questo, ma più di 1500000 dischi e più di 700 utenti:Selezionare distinto da usercolumn e valore minimo di date per ogni campo 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\ 
.... 

Vorrei avere dati distinti da usercolumn ed il valore minimo di data per ogni utente in questo modo:

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

ti prego, aiutami a scrivere un comando SQL per fare questo per l'adattatore oledb in C#, grazie.

+0

@ la risposta di dmitri (una volta corretta come per il mio commento) va bene per il problema, ma ho il sospetto che tu abbia dichiarato erroneamente il problema: in particolare, se hai altre colonne, è necessario un altro approccio. –

risposta

0

Qualcosa del genere dovrebbe fare il segno di spunta

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

"Errore SQL: le funzioni di aggregazione non sono consentite nella clausola GROUP BY" (almeno da decenti motori SQL! -). Basta rimuovere l'ultima riga, il raggruppamento per min (colonna dati) non ha senso e la risposta va bene senza comunque! -) –

+0

Mi spiace. Basta mistypes.Thanks per la correzione. –

0

Se si dispone di più di solo quei due colonne, la SQL migliore da utilizzare dipende un po 'su quale server avete all'altro capo di quella scheda OleDB, ma qui c'è qualcosa che funziona bene con molti (ahimè, non tutti!) tali possibili server:

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

che si poteva leggere come "emettono quelle file di thetable in modo tale che non v'è altra riga della tabella con il stesso utente e una data rigorosamente meno ". Se la data minima per un determinato utente può verificarsi più volte questo darà un numero di righe per quell'utente - se questo è un problema per te, ci sono anche delle soluzioni ... ma aspetterò che tu chiarisca la tua domanda di più prima io lavoro più su questo -)

2

questo lavoro per SQLServer 2008 e DB2:!

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

che darà risultati corretti, anche se è necessario includere più colonne nel selezionare.

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

Si noti che se si desidera altre colonne devono essere visualizzate nella clausola GROUP BY o essere costanti su righe. Altrimenti il ​​risultato sarà non deterministico.

+0

+1 La risposta più semplice e corretta – gbn

+0

ha funzionato per me, dopo il – 5er

+0

, dopo aver cercato per ore. Grazie –

0

si potrebbe provare questo:

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) 

Per quanto riguarda C#, cant aiutare voi là

0

Selezionare Nome utente DISTINTO, DATA DA TABLENAME COME DOVE A.DATE = (SELECT MIN (Data), dal TABLENAME WHERE USERNAME = A.USERNAME)