Два запроса дают разные результаты. Использование GROUP BY
вернет по одной строке на группу, а использование OVER ( PARTITION BY .. )
вернет все строки и продублирует результат LISTAGG
для каждой строки в разделе.
Используйте любое решение, которое больше подходит для желаемого результата, но они не эквивалентны.
SQL Fiddle
Настройка схемы Oracle 11g R2 :
CREATE TABLE employees ( department_id, last_name, hire_date ) AS
SELECT 1, 'AAA', DATE '2018-01-01' FROM DUAL UNION ALL
SELECT 1, 'BBB', DATE '2018-01-02' FROM DUAL UNION ALL
SELECT 1, 'CCC', DATE '2018-01-03' FROM DUAL UNION ALL
SELECT 2, 'DDD', DATE '2018-01-01' FROM DUAL UNION ALL
SELECT 2, 'EEE', DATE '2018-01-02' FROM DUAL;
Запрос 1 :
SELECT department_id AS "Dept.",
LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date) AS "Employees"
FROM employees
GROUP BY department_id
ORDER BY department_id
Результаты
| Dept. | Employees |
|-------|---------------|
| 1 | AAA; BBB; CCC |
| 2 | DDD; EEE |
Запрос 2 :
SELECT department_id AS "Dept.",
LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date)
OVER (PARTITION BY department_id) AS "Employees"
FROM employees
ORDER BY department_id
Результаты
| Dept. | Employees |
|-------|---------------|
| 1 | AAA; BBB; CCC |
| 1 | AAA; BBB; CCC |
| 1 | AAA; BBB; CCC |
| 2 | DDD; EEE |
| 2 | DDD; EEE |