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;

fiddle

→ Ссылка
Автор решения: 0xdb

Ожидаемый результат можно получить, например, так:

break on name 
select name, data from person order by name desc, id;

NAME       DATA            
---------- ----------------
sasha      qweqweqwe       
           werwerw         
dima       asdasdasd       
           zxczxczxc       
           dfgdfgdfg       
→ Ссылка