Я знаю, что это очень старый вопрос, но кто-то другой задал мне нечто подобное.
У меня нет TeraData, но вы не можете сделать следующее?
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
GROUP BY
теперь обеспечивает одну строку на курс на сотрудника. Это означает, что вам нужно просто MAX()
, чтобы получить max_course_date
.
До того, как ваш GROUP BY
просто давал по одной строке на сотрудника, а MAX() OVER()
пытался дать несколько результатов для этой одной строки (по одному на курс) .
Вместо этого теперь вам нужно выражение OVER()
, чтобы получить MAX()
для сотрудника в целом. Теперь это допустимо, потому что каждая отдельная строка получает только один ответ (так как она получена из супернабора, а не из поднабора). Кроме того, по той же причине условие OVER()
теперь относится к действительному скалярному значению, как определено предложением GROUP BY
; employee_number
.
1024 *
*
Возможно, короткий способ сказать, что aggregate
с предложением OVER()
должен быть надмножеством GROUP BY
, а не подмножеством.
Создайте запрос с помощью GROUP BY
на уровне, который представляет нужные вам строки, затем укажите предложения OVER()
, если вы хотите агрегировать на более высоком уровне.