2010-04-30 6 views
2

J'ai une table; qu'il soit appelé table1; avec les champs et les données suivantesComment récupérer les lignes (avec la valeur maximale dans un champ) ayant un autre champ commun?

alt text http://img228.imageshack.us/img228/3827/45939084.png

je besoin d'une requête qui renvoie l'enregistrement avec la valeur maximale dans Field3 pour chaque groupe d'enregistrements ayant la même valeur dans Field2. Alors que la requête retourne:

alt text http://img87.imageshack.us/img87/62/48847706.png

Comment cela pourrait-il être fait en utilisant des requêtes SQL?

Répondre

5

Ce:

WITH q AS 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY field2 ORDER BY field3 DESC) AS rn 
     FROM table1 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 

ou ceci:

SELECT q.* 
FROM (
     SELECT DISTINCT field2 
     FROM table1 
     ) qo 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM table1 t 
     WHERE t.field2 = qo.field2 
     ORDER BY 
       t.field3 DESC 
     ) q 

Selon le field2 cardinalité, la première ou la deuxième requête peut être plus efficace.

Voir cet article pour plus de détails:

+0

Merci Quassnoi. Le premier renvoie une colonne "rn" supplémentaire, veuillez la modifier comme suit: ...... AVEC q AS (SELECT *, ROW_NUMBER() OVER (PARTITION PAR champ2 ORDER BY champ3 DESC) AS rn FROM table1) SELECT Champ1 , Field2, Field3, Field4 FROM q WHERE rn = 1 ...... mais le second est super, aussi l'article est génial. Merci beaucoup. –

Questions connexes