Функция LISTAGG
Статьи про Oracle -> Программирование
Функция LISTAGG
v:1.0 09.08.2011
Петрелевич Сергей
Источник информации: Oracle® Database SQL Language Reference
Синтаксис
Дополнительная информация:
"Analytic Functions"
описание синтаксиса, семантики и ограничений конструкций ORDER
BY
и OVER
Назначение
Функция LISTAGG
упорядочивает данные, объединенные в группы конструкцией ORDER
BY
,
после чего соединяет значение колонки <measure>
Функция может использоваться по разному:
- Как одиночная агрегатная (aggregate) функция
LISTAGG
обрабатывает все ряды и возвращает одно значение. - Как групповая агрегатная функция
LISTAGG
обрабатывает группы данных, определенных конструкциямиGROUP
BY
и возвращает результирующее значение для каждой группы. - Как аналитическая функция
LISTAGG
обрабатывает данные, разделенные на блоки, задаваемые одним или несколькими выражениямиquery_partition_clause
.
Аргументы функции определяются следующими правилами:
- Аргумент
measure_expr
может быть любым выражением. Значения Null игнорируются. - Аргумент
delimiter_expr
задает строку, которая разделяет значения в результирующей строке. Аргумент не обязательный по умолчанию онNULL
. - Аргумент
order_by_clause
определяет порядок, в котором будут возвращены склеенные результирующие значения. Функция будет рассматриваться как deterministic, только в том случае, если выражениеORDER
BY
определяет уникальную последовательность.
Функция возвращает тип RAW
, если объединяемые колонки имеют тип RAW
, иначе тип результата - VARCHAR2
.
Примеры
В этом примере одиночная агрегатная функция возвращает список сотрудников департамента 30, упорядоченных по дате приема на работу и фамилии:
SELECT LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name) "Emp_list", MIN(hire_date) "Earliest" FROM employees WHERE department_id = 30; Emp_list Earliest ------------------------------------------------------------ --------- Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares 07-DEC-02
В этом примере групповая агрегатная функция возвращает список сотрудников, сгруппированных по департаментам и упорядоченных по дате приема на работу:
SELECT department_id "Dept.", LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date) "Employees" FROM employees GROUP BY department_id; Dept. Employees ------ ------------------------------------------------------------ 10 Whalen 20 Hartstein; Fay 30 Raphaely; Khoo; Tobias; Baida; Himuro; Colmenares 40 Mavris 50 Kaufling; Ladwig; Rajs; Sarchand; Bell; Mallin; Weiss; Davie s; Marlow; Bull; Everett; Fripp; Chung; Nayer; Dilly; Bissot ; Vollman; Stiles; Atkinson; Taylor; Seo; Fleaur; Matos; Pat el; Walsh; Feeney; Dellinger; McCain; Vargas; Gates; Rogers; Mikkilineni; Landry; Cabrio; Jones; Olson; OConnell; Sulliv an; Mourgos; Gee; Perkins; Grant; Geoni; Philtanker; Markle 60 Austin; Pataballa; Lorentz; Ernst; Hunold 70 Baer ...
А в этом примере демонстрируется аналитическая функция. Выводится список сотрудников, нанятых до 1 сентября 2003г., сотрудники группируются по департаментам, причем для каждого сотрудника выводится список других сотрудников, которые тоже были наняты в этот департамент до до 1 сентября 2003г.:
SELECT department_id "Dept", hire_date "Date", last_name "Name", LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name) OVER (PARTITION BY department_id) as "Emp_list" FROM employees WHERE hire_date < '01-SEP-2003'; Dept Date Name Emp_list ----- --------- --------------- --------------------------------------------- 30 07-DEC-02 Raphaely Raphaely; Khoo 30 18-MAY-03 Khoo Raphaely; Khoo 40 07-JUN-02 Mavris Mavris 50 01-MAY-03 Kaufling Kaufling; Ladwig 50 14-JUL-03 Ladwig Kaufling; Ladwig 70 07-JUN-02 Baer Baer 90 13-JAN-01 De Haan De Haan; King 90 17-JUN-03 King De Haan; King 100 16-AUG-02 Faviet Faviet; Greenberg 100 17-AUG-02 Greenberg Faviet; Greenberg 110 07-JUN-02 Gietz Gietz; Higgins 110 07-JUN-02 Higgins Gietz; Higgins
Интересные ссылки по этой теме
Метки: SQL
Внимание.
Комментировать могут только зарегистрированные пользователи.
Возможно использование следующих HTML тегов: <a>, <b>, <i>, <br>.