Soit un tableauAdes personnes, leur langue maternelle et d'autres colonnes C3 .. C10 représentées par ...
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?
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.
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)
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;
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 )
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
select person, language
from table A
group by person, language
renverra des lignes uniques
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)