Sélectionnez plusieurs colonnes (fonction non agrégée) avec GROUP BY
Je suis en train de sélectionner la valeur maximale d'une colonne, tandis que le groupement par un autre non-colonne d'id unique qui dispose de plusieurs valeurs en double. La base de données d'origine ressemble à quelque chose comme:
mukey | comppct_r | name | type
65789 | 20 | a | 7n
65789 | 15 | b | 8m
65789 | 1 | c | 1o
65790 | 10 | a | 7n
65790 | 26 | b | 8m
65790 | 5 | c | 1o
...
Cela fonctionne bien en utilisant:
SELECT c.mukey, Max(c.comppct_r) AS ComponentPercent
FROM c
GROUP BY c.mukey;
Qui retourne un tableau du type:
mukey | ComponentPercent
65789 | 20
65790 | 26
65791 | 50
65792 | 90
Je veux être en mesure d'ajouter d'autres colonnes dans sans incidence sur le GROUPE PAR fonction, pour inclure des colonnes comme le nom et le type dans la table de sortie comme:
mukey | comppct_r | name | type
65789 | 20 | a | 7n
65790 | 26 | b | 8m
65791 | 50 | c | 7n
65792 | 90 | d | 7n
mais il y a toujours produit un message d'erreur indiquant que j'ai besoin d'utiliser une fonction d'agrégation avec l'instruction select. Comment dois-je faire?
source d'informationauteur Dylansq
Vous devez vous connecter pour publier un commentaire.
Vous avez vous-même un plus-n-p-groupe problème. C'est l'une des solutions possibles:
Une autre approche possible, même de sortie:
Il y a un ensemble complet et explicatif de réponse sur le sujet ici: SQL Sélectionnez uniquement les lignes avec la Valeur de Max sur une Colonne
Non-colonne d'agrégation devrait être là dans la clause Group By .. pourquoi??
Vous essayez maintenant de vous écrire une requête comme:
Maintenant cette requête aura pour résultat une seule ligne, mais ce doit être la valeur de x1?? Fondamentalement c'est un comportement indéfini. Pour surmonter cette difficulté, erreur SQL de cette requête.
Maintenant, venir à ce point, vous pouvez soit choisi la fonction d'agrégation de x1 ou vous pouvez ajouter x1 de groupe. Notez que tout ceci dépend de votre exigence.
Si vous voulez toutes les lignes avec l'agrégation sur z1 regroupement par y1, vous pouvez utiliser SubQ approche.
Ceci va produire un résultat comme:
Essayez d'utiliser une table virtuelle comme suit:
Vous ne pouvez pas ajouter des colonnes supplémentaires sans les ajouter à la
GROUP BY
ou l'application d'une fonction d'agrégation. La raison en est que, que les valeurs d'une colonne peut être différente à l'intérieur d'un groupe. Par exemple, vous pourriez avoir deux lignes:Comment le groupe agrégé pour les colonnes
name
ettype
?Si le nom et le type est toujours le même à l'intérieur d'un groupe, il suffit de l'ajouter à la
GROUP BY
clause: