SQL Listagg как дополнительный столбец - PullRequest
0 голосов
/ 11 октября 2018

Я ищу запрос Oracle SQL, который агрегирует столбец, но добавляет агрегацию как дополнительный столбец, а не «действительно» агрегирует строки.Таким образом, я хочу получить одинаковое количество строк с дополнительным столбцом с агрегированными значениями.Пример ниже должен помочь понять, что я имею в виду.

Стартовая таблица:

ID    GIVEN_NAME   LAST_NAME
11    CARL         CLARKE
22    CARL         CLARKE
33    CARL         CLARKE
44    ANDREW       JOHNSON
55    ANDREW       JOHNSON

Обычная группа listagg (ID) по GIVEN_NAME и LAST_NAME даст мне:

LISTAGG(ID)   GIVEN_NAME   LAST_NAME
112233        CARL         CLARKE
4455          ANDREW       JOHNSON

Что мне нужно, так это просто добавить статистический столбец:

AGGREGATE   ID    GIVEN_NAME   LAST_NAME
112233      11    CARL         CLARKE
112233      22    CARL         CLARKE
112233      33    CARL         CLARKE
4455        44    ANDREW       JOHNSON
4455        55    ANDREW       JOHNSON

Возможно ли это?Спасибо!

Ответы [ 4 ]

0 голосов
/ 11 октября 2018

это будет работать:

create table table123(col1 varchar(20),col2 varchar(20),col3 varchar(20)) 
insert into table123 values('11' ,   'CARL'   ,      'CLARKE');
insert into table123 values('22'  ,  'CARL'    ,     'CLARKE');
insert into table123 values('33'  ,  'CARL'    ,    'CLARKE');
insert into table123 values('44'  ,  'ANDREW'  ,     'JOHNSON');
insert into table123 values('55'  ,  'ANDREW'  ,     'JOHNSON');
SELECT * FROM table123;

SELECT a.col1,a.col2,a.col3,(select LISTAGG(col1, '') WITHIN GROUP (ORDER BY 
col2) "aggreaget" from table123 where col2=a.col2 group by col2 ) 
FROM table123 a group by a.col2,a.col1,a.col3 order by a.col1

пример вывода:

11  CARL    CLARKE  112233
22  CARL    CLARKE  112233
33  CARL    CLARKE  112233
44  ANDREW  JOHNSON 4455
55  ANDREW  JOHNSON 4455
0 голосов
/ 11 октября 2018

Два варианта LISTAGG агрегированные и аналитические.

Вы ищете аналитический вариант:

Агрегатная функция

select name, listagg(id) within group (order by id)  as lst
from tab
group by name;

NAME LST 
---- ------
X    1112   
Y    1314

Аналитическая функция

Обратите внимание, что предложение OVER, в котором использование PARTITION BY представляет ключ группировки.

select name, id, listagg(id) within group (order by id) over( partition by name)  as lst
from tab;


NAME         ID LST  
---- ---------- -------
X            11 1112    
X            12 1112    
Y            13 1314     
Y            14 1314 
0 голосов
/ 11 октября 2018

Используйте функцию LISTAGG в аналитической форме (ПЕРЕВЕРНИТЕ (аналитическое предложение)):

select GIVEN_NAME, LAST_NAME,
    LISTAGG(ID) WITHIN GROUP (ORDER BY ID) OVER (PARTITION BY department_id) as "AGGREGATE"
  from SOMETABLE

См. Также Аналитический пример в документации LISTAGG

0 голосов
/ 11 октября 2018

вот один вариант для вас, используя listagg:

with sample_data as (
    select level     id,level given_name,level last_name from dual connect by level <= 10
    union all
    select level+30  id,level given_name,level last_name from dual connect by level <= 5
    union all
    select level+500 id,level given_name,level last_name from dual connect by level <= 3
    order by id
)
select 
    (select listagg(id) within group (order by id) 
     from sample_data di 
     where di.given_name=d.given_name and di.last_name=d.last_name) aggregate
    ,d.* 
    from sample_data d
 ;
...