sql oracle группировка
Понимаю, что странный запрос, я такого не видел, но нужно вынести в бд группировку для оптимизации отчёта, и, например, с такими данными:
create table person(id number, name varchar2(10), data varchar2(100));
insert into person(id, name, data) values(1, 'sasha', 'qweqweqwe');
insert into person(id, name, data) values(2, 'sasha', 'werwerw');
insert into person(id, name, data) values(3, 'dima', 'asdasdasd');
insert into person(id, name, data) values(4, 'dima', 'zxczxczxc');
insert into person(id, name, data) values(5, 'dima', 'dfgdfgdfg');
Получить такой результат:
sasha qweqweqwe
werwerw
dima asdasdasd
zxczxczxc
dfgdfgdfg
То есть чтобы как бы distinct, но для одного группирумого поля. Всю голову поломал, ничего придумать не могу. Версия 11g. Уточню суть. Сам запрос к бд выполняется быстро, но отчёт из-за группировки данных (15 тысяч строк) строится минут 20. Если группировку (не group by) в отчёте убрать и сделать её сразу в запросе, то на скорость запроса не должно сильно повлиять, зато отчёт будет собираться быстрее
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
WITH cte AS ( SELECT id,
name,
data,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY data) rn
FROM person )
SELECT CASE WHEN rn = 1
THEN name
ELSE ''
END name,
data
FROM cte
ORDER BY cte.name, rn;
или
SELECT CASE WHEN LAG(name) OVER (ORDER BY name, data) = name
THEN ''
ELSE name
END name,
data
FROM person
ORDER BY person.name, data;
Автор решения: 0xdb
→ Ссылка
Ожидаемый результат можно получить, например, так:
break on name
select name, data from person order by name desc, id;
NAME DATA
---------- ----------------
sasha qweqweqwe
werwerw
dima asdasdasd
zxczxczxc
dfgdfgdfg