Ceci est une requête qui sélectionne un ensemble de lignes souhaitées: La table a une clé primaire, dans la colonne J'aimerais identifier ces lignes dans une autre requête, en obtenant la clé primaire de chacune de ces lignes. Comment ferais-je cela? Cela ne fonctionne pas: P> ID code>. P>
select distinct on (id) id, max(a), b, c, d, e
from T
group by b, c, d, e;
ERROR: column "T.id" must appear in the GROUP BY clause or be used in an aggregate function
5 Réponses :
Utilisez votre requête d'origine en tant que sous-requête et utilisez ces résultats à vous joindre à la table d'origine pour trouver l'ID.
SELECT T.id, T.a, T.b, T.c, T.d, T.e FROM (SELECT max(a) AS MaxA, b, c, d, e FROM T GROUP BY b,c,d,e) q INNER JOIN T ON T.a = q.MaxA AND T.b = q.b AND T.c = q.c AND T.d = q.d AND T.e = q.e
@Claudiu Ça ne devrait pas être. L'ajout d'une indexation sur (A, B, C, D, E) l'aiderait probablement.
en vertu du fait que vous êtes grouper em>, il peut (et sera probablement probablement) être plus d'un enregistrement correspondant (par exemple, plus d'un postgreSQL est assez strict - il ne devinera pas à ce que vous voulez dire. p>
Voir cette question: Equivalent de l'équivalent Postgresql? P>
Je suggère que vous considérez comme le plus efficace des possibilités. P>
J'espère que cela aide. Merci! P> ID code> valeur code>) par enregistrement retourné. p>
B, C, D, E CODE> LI>
array_agg code> Fonction de regroupement pour obtenir une matrice de
ID code> Valeurs par enregistrement. LI>
ol>
Puis-je dire Postgres que je souhaite un enregistrement ID code> je m'en fiche? (Depuis que je ne le fais pas)
Juuust curieux l'ajoute au groupe par clause fonctionne?
Si vous ne vous souciez pas duquel en fonction de vos données, je pense que l'utilisation d'une fonction de fenêtre serait un Meilleur plan (merci à Evil Otto pour la démarrage à la tête): p> ID code> Vous obtenez, il vous suffit de saisir votre
ID code> dans une fonction d'agrégation garantie de vous donner un
valide ID code>. Le
max code> et
min code> agrégats viennent à l'esprit:
Sachez que les lignes renvoyées par cette requête ne seront pas nécessairement des lignes dans votre table.
@Evil: C'est un bon point et pourrait être un problème en fonction des données et de la précision "Je souhaite un enregistrement d'identification donné et je m'en fiche?" est (voir le commentaire sur la réponse de Gahooa).
@Evilotto: Pourriez-vous aller dans la manière dont cela pourrait être le cas?
Considérons les lignes (99,1,1,1,1,1) et (1,99,1,1,1,1) - max (ID) est 99, max (a) est 99, cette requête donne à la fois maxes: (99,99,1,1,1)
@Evil: Je pense qu'une fonction de fenêtre pourrait être une meilleure approche, je viens d'ajouter une possibilité si vous souhaitez vérifier.
@Claudiu: Toutes mes excuses pour les dégâts cérébraux, mais je pense que ma mise à jour est ce que vous êtes après, mais nous verrons si M. Otto vérifiera cela comme je suis un peu en dehors du moment.
Ce n'est pas ce que vous avez demandé, mais je soupçonne ce que vous essayez de faire est d'obtenir la ligne unique correspondant à la valeur maximale d'une colonne pour chaque groupe défini par plusieurs autres colonnes. Par exemple, pour trouver la journée qui était le lundi / mardi / etc. le plus chaud pour une année entière.
Le meilleur moyen que j'ai trouvé pour cela utilise une vue pour trouver toutes les valeurs maximales pour les groupes. Si votre table d'origine est p> puis crée la vue "max" comme p> (Quelle est votre requête initiale) puis rejoignez cette vue à votre table pour obtenir des lignes avec des valeurs maximales: p>
ah oui c'est vraiment ce que je veux! Je ne me suis même pas réalisé que ce n'est pas ce que j'ai demandé ...
Essayez-vous d'obtenir l'identifiant de la ligne avec une valeur maximale ou essayez-vous d'obtenir un identifiant qui a B, C, D, E qui peut ou non avoir la valeur maximale?
@Evilotto: les identifiants de ces rangées exactement que la requête initiale revient
Les rangées que votre requête d'origine ne correspondent pas aux lignes simples de votre base de données. Pour chaque ligne renvoyée par la requête, il peut y avoir une ou plusieurs lignes de table correspondant.
@Evilotto: Je vois. J'essaie d'obtenir l'identifiant de la ligne avec le maximum de valeur, oui
@Claudiu: Sauf si
A code> est unique, il peut y avoir plus que une ligne i> avec le maximum
A code>, et donc plus d'un
ID code> correspondant aux critères. Vous êtes au courant de cela, non?