2010-12-30 2 views
1

Désolé si le titre est difficile à comprendre - je ne suis pas sûr de savoir comment décrire ce que je veux faire. Disons que j'ai cette table. test1 et test2 sont des colonnes int, alors que test3 est une chaîne/varchar:Sélectionnez le champ supérieur en fonction de la commande d'un autre champ

test1 | test2 | test3 
1  1  one 
1  2  two 
1  3  three 
1  4  four 
2  10  ten 
2  11  eleven 
2  12  twelve 
3  101  one hundred one 
3  104  one hundred four 
3  107  one hundred seven 

J'essaie de comprendre la requête de sélection qui renverra le haut test3 pour chaque test1, où la commande est effectuée en fonction de la valeur dans test2. En d'autres termes, je suis en train de trouver la requête qui renverra ceci:

test1 | test3 
1  four 
2  twelve 
3  one hundred seven 

Ce serait vraiment super si la solution pourrait fonctionner à la fois sur MS SQL Server (2005 et 2008) et MS Access (2007 et 2010).

+1

Je crois que vous vouliez '1, quatre' à la place, non? – Quassnoi

+0

Merci, édité pour corriger. –

Répondre

1

En SQL Server:

SELECT test1, test3 
FROM (
     SELECT test1, test3, ROW_NUMBER() OVER (PARTITION BY test1 ORDER BY test2 DESC) AS rn 
     FROM mytable 
     ) q 
WHERE rn = 1 

ou

SELECT test1, test3 
FROM (
     SELECT DISTINCT test1 
     FROM mytable 
     ) md 
CROSS APPLY 
     (
     SELECT TOP 1 
       test3 
     FROM mytable mi 
     WHERE mi.test1 = md.test1 
     ORDER BY 
       mi.test2 DESC 
     ) mt 

Chacune de ces méthodes peut être plus efficace qu'une autre, en fonction de votre distribution de données.

Cet article peut être vous intéresser:

2

réponse dénominateur commun le plus bas A.

SELECT yourtable.test1, yourtable.test3 
FROM yourtable 
INNER JOIN 
(
SELECT test1, MAX(test2) AS test_2 
FROM yourtable 
GROUP BY test1 
) t 
ON t.test1 = yourtable.test1 AND t.test_2 = yourtable.test2 
Questions connexes