10
votes

Max () et max () sur la partition par la partition de Produit une erreur 3504 dans la requête Teradata

J'essaie de produire une table de résultats avec la dernière date de cours terminée pour chaque code de cours, ainsi que le dernier code de cours terminé dans l'ensemble de chaque employé. Ci-dessous ma requête:

3504 : Selected non-aggregate values must be part of the associated group


1 commentaires

Parce que vous utilisez sur la référence avec le maximum, SQL les voit comme des fonctions analytiques - pas d'agrégats.


5 Réponses :


6
votes

Comme les poneys le dit dans un commentaire, vous ne pouvez pas mélanger les fonctions OLAP avec des fonctions agrégées.

Il est peut-être plus facile d'obtenir la dernière date d'achèvement pour chaque employé et de la joindre à un jeu de données contenant la dernière date d'achèvement pour chacun des trois cours ciblés.

Il s'agit d'une idée non testée qui devrait, espérons-le, vous mettre le chemin droit: xxx


0 commentaires

1
votes

Je sais que c'est une question très ancienne, mais quelqu'un d'autre quelque chose de similaire.

Je n'ai pas de Teradata, mais je ne peux pas faire ce qui suit? P>

SELECT employee_number,
       course_code,
       MAX(course_completion_date)                                     AS max_course_date,
       MAX(course_completion_date) OVER (PARTITION BY employee_number) AS max_date
FROM employee_course_completion
WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
GROUP BY employee_number, course_code


1 commentaires

Cela produira également le même message d'erreur. Les fonctions d'OLAP logiquement sont calculées après Group par / ayant, vous ne pouvez donc accéder que les colonnes du groupe ou des colonnes avec une fonction agrégée. Suite à l'apparence, mais est standard SQL: max (max (Course_completion_date) sur (partition par employé_number) et comme Teradata permet de réutiliser un alias qui fonctionne également: max (max_course_date) sur (Partition par employé_number)



4
votes

Les fonctions Logiquement OLAP sont calculées après le groupe par / ayant, vous ne pouvez donc accéder que des colonnes dans le groupe ou des colonnes avec une fonction globale. Après l'apparence étrange, mais est standard SQL: xxx pré>

et comme Teradata permet de réutiliser un alias qui fonctionne également: P>

SELECT employee_number,
       MAX(max_date) 
           OVER (PARTITION BY course_code) AS max_course_date,
       MAX(course_completion_date) AS max_date
FROM employee_course_completion
WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
GROUP BY employee_number, course_code


3 commentaires

Vous avez indiqué que les fonctions OLAP sont calculées après Groupe par / ayant , mais dans vous ci-dessus, vous utilisez le Code Course dans la clause de partition, Ce qui ne fait pas partie du groupe par la clause . Le code ci-dessus ne fonctionne pas dans Oracle. L'erreur est 'ora-00979: pas un groupe par expression`


@frank: correct, cours_code doit être ajouté au groupe par


Merçi pour la confirmation. Les nouvelles fonctions analytiques n'étaient pas sûres si j'avais raison.



0
votes

Je pense que cela fonctionnera même si c'était il y a toujours.

SELECT employee_number, Row_Number()  
   OVER (PARTITION BY course_code ORDER BY course_completion_date DESC, Id Desc) as rownum    FROM employee_course_completion
WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
   AND rownum = 1


0 commentaires

-1
votes
SELECT employee_number, course_code, MAX(course_completion_date) AS max_date
FROM employee_course_completion
WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
GROUP BY employee_number, course_code

1 commentaires

Bienvenue à! Merci d'avoir posté une réponse, mais il a besoin d'une explication sur la raison pour laquelle cela résout le problème.