2009-02-11 7 views
0

Considérons le tableau suivant:Comment sélectionner des éléments distincts lorsqu'ils apparaissent répétés dans un tableau? (T-SQL)

create table temp 
(     
    name int, 
    a int, 
    b int 
) 

insert into temp (name, a, b) 
values (1, 2, 3) 

insert into temp (name, a, b) 
values (1, 4, 5) 

insert into temp (name, a, b) 
values (2, 6, 7) 

Je veux sélectionner * (tous les champs) avec [nom] distinct. Dans le cas de deux ou plusieurs lignes ayant le même [nom], pour choisir d'afficher la première (1, 2, 3) ou la deuxième rangée (1, 4, 5), la règle peut être de choisir celle avec une plus grande [b]

Pouvez-vous indiquer comment dois-je écrire cette procédure stockée?

+0

Si b est supérieur, est-il garanti que sera également supérieur? –

+0

@Mark no. A et B sont indépendants. –

Répondre

1

Voici une façon de le faire sql 2000 et jusqu'à la version

select t1.* from(
select name,max(B) as MaxB 
from temp 
group by name) t2 
join temp t1 on t1.a = t2.MaxB 
and t1.name = t2.name 

SQL 2005 et jusqu'à la version

select name, a, b 
from (
select m.*, 
row_number() over (
partition by name 
order by B desc) as rn 
from temp m 
) m2 
where m2.rn = 1; 
+0

sql2000 travaillé =) –

+0

Vous voulez dire l'ordre par B desc. –

4
SELECT t.* 
FROM temp t 
INNER JOIN (
    SELECT name, max(b) as b 
    FROM temp 
    GROUP BY name 
) m 
ON t.name = m.name 
AND t.b = m.b 

Pas exactement rapide sur de grandes tables, sauf si vous avez un index sur le nom, b.

+0

+1 pour les indices –

2

En MSSQL 2005 et au-dessus:

SELECT name, a, b 
FROM (
    SELECT temp.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY b DESC) AS rn 
    FROM temp 
) t 
WHERE rn = 1 
+0

+1 pour l'alternative –

0
CREATE VIEW Max_B_From_Temp AS 
SELECT name,Max(b) as b 
FROM temp 
GROUP BY name 

SELECT temp.* 
FROM temp INNER JOIN Max_B_From_Temp 
ON 
    temp.name=Max_B_From_Temp.name and 
    temp.b=Max_B_From_Temp.b 

ne est pas une procédure stockée, mais vous pouvez appeler la requête d'un.

Questions connexes