2010-03-11 4 views
1

Comment procéder? J'ai 3 lignes comme ceci:Aide sur une requête SQL

ID   THREAD   POST 
1   1    Hello World 
2   2    Hello galaxy 
3   2    Hello people 

J'ai besoin de revenir ID, fil, et après pour chaque thread utilisant uniquement le plus bas ID.

quelque chose comme:

SELECT * FROM table WHERE THREAD DISTINT AND ID = MIN(ID) 

Edit: Pour être plus clair dans cet exemple, il ne doit renvoyer les lignes pour 1 et 2 parce que 3 n'est pas l'ID le plus bas avec un fil de 2

edit 2: il doit retourner les lignes 1 et 2.

+0

quelle base de données utilisez-vous? – beny23

Répondre

3

Dans SQL Server 2005 et au-delà:

SELECT t.Id, t.Thread, t.Post 
FROM 
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY Thread ORDER BY Id) as RowNumInThread 
FROM table 
) t 
WHERE t.RowNumInThread = 1 
; 

ou

SELECT t.* 
FROM 
(
    SELECT Min(Id) as MinId 
    FROM table 
    GROUP BY Thread 
) tmin 
JOIN 
table t ON t.Id = tmin.Id 
; 
+0

besoin de renvoyer ID, Thread et Post une fois ** pour chaque thread utilisant uniquement l'ID le plus bas ** –

+0

Oui, c'est ce que fait ma requête. Pour chaque partition de Threads, renvoyez la ligne qui a RowNumInThread à 1. –

+0

Et pour la deuxième requête, je grouper par Thread, donc la sous-requête retourne tout ID qui est le minimum pour un groupe. Il semble très bien à partir des données exemple que Id est un champ unique, donc je n'ai pas besoin de retourner Thread de la sous-requête. –

2
select id, thread, post 
from t 
inner join (
select min(id) 
from t 
group by thread) subq on t.id = subq.id 
1

Vous pouvez essayer quelque chose comme

SELECT t.* 
FROM Table t INNER JOIN 
     (
      SELECT MIN(ID) MINID, 
        Thread 
      FROM Table 
      GROUP BY Thread 
     ) sub ON t.ID = sub.MINID 
       AND t.Thread = sub.Thread 
+0

Typo ... vous ne voulez pas dire tempdb.Thread, vous voulez dire t.Thread. Erreur Intellisense Je devine ... –

+0

Thanx, Sql Server 2008 Intellisense peut être à la fois bon et mauvais X-) –