web-dev-qa-db-fra.com

Oracle 11g SQL pour obtenir des valeurs uniques dans une colonne d'une requête multi-colonnes

Soit un tableauAdes personnes, leur langue maternelle et d'autres colonnes C3 .. C10 représentées par ...

Tableau a

 PERSON LANGUE ...
 Bob english 
 John anglais 
 Vlad russe 
 Olga russe 
 Jose espagnol 

Comment construire une requête qui sélectionne toutes les colonnes d'une ligne pour chaque langue distincte?

Résultat désiré

 PERSONNE LANGUE ...
 Bob anglais 
 Vlad russe 
 Jose espagnol 

Peu m'importe quelle rangée de chaque langue distincte donne le résultat. Dans le résultat ci-dessus, j'ai choisi le numéro de ligne le plus bas de chaque langue.

17
Ian Cohen

Eric Petroelje a presque raison

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

Remarque: utilisation de ROWID (ID unique de ligne), pas de ROWNUM (qui donne le numéro de ligne dans le jeu de résultats)

34
Joe

Ce sera plus efficace, plus vous aurez le contrôle sur la commande utilisée pour choisir une valeur:

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language
               ORDER BY person)
      ,language
FROM   tableA;

Si vous ne vous souciez pas de savoir quelle personne est choisie pour chaque langue, vous pouvez omettre la clause ORDER BY:

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language)
      ,language
FROM   tableA;
10
Jeffrey Kemp

Mon Oracle est un peu rouillé, mais je pense que cela fonctionnerait:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
6
Eric Petroelje

J'utiliserais la fonction RANK () dans une sous-sélection, puis tirerais simplement la ligne où rang = 1.

select person, language
from
( 
    select person, language, rank() over(order by language) as rank
    from table A
    group by person, language
)
where rank = 1
2
Harper Shelby
select person, language     
from table A     
group by person, language  

renverra des lignes uniques

0
Phil

Pour des raisons d'efficacité, vous souhaitez consulter les données une seule fois, comme le fait Harper. Cependant, vous ne voulez pas utiliser rank () car cela vous donnera des liens et vous souhaitez ensuite grouper par langue plutôt que par ordre. A partir de là, vous voulez ajouter une clause order by pour distinguer les lignes, mais vous ne voulez pas trier les données. Pour ce faire, j'utiliserais "order by null", par exemple.

count (*) over (groupe par ordre de langue par null)

0
Scott Swank