1. ホーム
  2. sql

[解決済み] Teradata QueryでMAX()およびMAX() OVER PARTITION BYがエラー3504を発生させる。

2022-03-11 05:14:32

質問

各コースコードの最終修了日、および各従業員の最終修了コースコード全体を含む結果テーブルを作成しようとしています。以下は、私のクエリです。

SELECT employee_number,
       MAX(course_completion_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

このクエリでは、次のようなエラーが発生します。

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

MAX() OVER (PARTITION BY...)の行を削除すると、クエリは正常に実行されるので、問題をその行に分離しましたが、このフォーラムとインターネットを検索しても、何が間違っているのかわかりません。どなたか助けていただけませんか?

解決方法を教えてください。

ポニーさんのコメントにあるように、OLAP関数と集計関数を混在させることはできません。

おそらく、各従業員の最終修了日を取得し、それを3つの対象コースそれぞれの最終修了日を含むデータセットに結合する方が簡単でしょう。

これは未検証のアイデアですが、うまくいけば正しい道を歩むことができるはずです。

  SELECT employee_number,
         course_code,
         MAX(course_completion_date) AS max_date,
         lcc.LAST_COURSE_COMPLETED
    FROM employee_course_completion ecc
         LEFT JOIN (
             SELECT employee_number,
                    MAX(course_completion_date) AS LAST_COURSE_COMPLETED
               FROM employee_course_completion
              WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
         ) lcc
         ON lcc.employee_number = ecc.employee_number
   WHERE course_code IN ('M910303', 'M91301R', 'M91301P')
GROUP BY employee_number, course_code, lcc.LAST_COURSE_COMPLETED