2009-06-20 15 views
6

J'ai quelques données comme cela, mais plus de 1500000 dossiers et plus de 700 utilisateurs:Sélectionnez distincte de usercolumn et la valeur minimale des dates pour chaque champ 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\ 
.... 

Je voudrais avoir des données distinctes de usercolumn et la valeur minimale de ce jour pour chaque utilisateur comme ceci:

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

s'il vous plaît aidez-moi à écrire une commande SQL pour le faire pour adaptateur oledb en C#, merci.

+0

La réponse de @ dmitri (une fois corrigée selon mon commentaire) est correcte pour le problème que vous indiquez, mais je suppose que vous avez mal indiqué le problème: en particulier, si vous avez d'autres colonnes, vous avez besoin une autre approche. –

Répondre

0

Quelque chose comme cela devrait faire la tique

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

"Erreur SQL: les fonctions d'agrégat ne sont pas autorisées dans la clause GROUP BY" (au moins de moteurs SQL décents!). Il suffit de supprimer la dernière ligne, le regroupement par min (colonne de date) n'a aucun sens et la réponse est bien sans elle de toute façon! -) –

+0

Désolé. Juste mistypes.Thanks pour la correction. –

0

Si vous avez plus que ces deux colonnes, la meilleure SQL à utiliser dépend un peu de ce serveur que vous avez à l'autre extrémité de cet adaptateur OleDB, mais voici quelque chose qui fonctionne bien avec beaucoup (hélas, pas tous!) les serveurs possibles:

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

que vous pouvez lire « émettre les lignes de theTable telle qu'il n'y a pas d'autre ligne de la table avec la même utilisateur et une date strictement inférieure ". Si la date minimale pour un utilisateur donné peut arriver plusieurs fois, cela donnera autant de lignes pour cet utilisateur - si c'est un problème pour vous, il y a aussi des solutions ... mais je vais attendre que vous clarifiiez votre question plus avant que je travaille plus sur ce point -)

2

cela fonctionne pour SQLServer 2008 et DB2:

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

Il donnera des résultats appropriés, même si vous devez inclure plusieurs colonnes dans la sélection.

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

Notez que si vous voulez d'autres colonnes, elles doivent apparaître dans la clause GROUP BY ou être constantes entre les lignes. Sinon, le résultat sera non déterministe.

+0

+1 La réponse la plus simple et correcte – gbn

+0

a travaillé pour moi, enfin – 5er

+0

, après avoir cherché pendant des heures. Merci –

0

vous pouvez essayer ceci:

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) 

Comme pour C#, vous aide ne peux pas y

0

SELECT DISTINCT USERNAME, DATE DE TABLENAME COMME OU A.DATE = (SELECT MIN (DATE) DE TABLENAME O US USERNAME = A.USERNAME)