2010-05-06 7 views
2

J'ai une table avec 6 champs. les colonnes sont ID, new_id price, title, Img, Active. J'ai des données qui sont dupliquées pour la colonne des prix. Lorsque je fais une sélection je veux montrer seulement des lignes distinctes où new_id n'est pas la même chose. e.g.-Éliminer les doublons dans la requête SQL

ID New_ID Price Title  Img Active 
1 1  20.00 PA-1  0X4... 1 
2 1  10.00 PA-10  0X4... 1 
3 3  20.00 PA-11  0X4... 1 
4 4  30.00 PA-5  0X4... 1 
5 9  20.00 PA-99A 0X4... 1 
6 3  50.00 PA-55  0X4... 1 

Lors de l'exécution de l'instruction SELECT, seules les lignes avec ID (1,4,9,6) devraient montrer. Raison étant le new_ID avec le prix plus élevé devrait apparaître. Comment puis-je faire cela?

+1

Il n'y a pas de ligne avec ID 9? –

+0

désolé, je voulais dire 1,4,5,6. max price et new_id une seule fois – ewdef

+0

Combien de lignes y aura-t-il? Quelle est l'importance de la performance? –

Répondre

2

dans une base de données qui prend en charge l'agrégation de fenêtre (Oracle, SQL Server 2005, postgresql 8.4) quelque chose comme:

select id, new_id, price, title, img, active 
from (select id, new_id, price, title, img, active, 
      row_number() over (partition by new_id order by price desc) as position 
     from the_table 
) where position = 1 
0
select * 
from T as t 
where exists (select 1 from T where new_id = t.new_id 
group by new_id having max(price) = t.price) 

Pour tester l'existence, utilisez exists! Ici, vous voulez que ces lignes aient le prix maximum basé sur new_id.

Je veux montrer que des lignes distinctes

Souvent, quand quelqu'un veut « lignes distinctes », ils veulent vraiment les « dernières » lignes ou ceux qui ont quelque chose « le plus ». Il peut presque toujours être exprimé sous une forme similaire à celle ci-dessus.

0
select * from ABC where charge_amt in(
SELECT  charge_amt 
FROM   ABC 
GROUP BY charge_amt 
HAVING  (COUNT(charge_amt) = 1)) 
order by charge_amt asc 
Questions connexes