Убрать из запроса "where" чтобы запрос oracle был универсальный для всей таблицы

у меня есть запрос .Этот запрос ищет из таблицы первые 2 записи, и последние 2 записи и записывает их в строку, ставя между ними знак "→". Запросто работает нормально, но если я указываю в "where t.keys = 'STIG6JGK'". Я хочу переделать этот запрос, чтобы он работал без "where" и находил эту срока для каждого ключа. Но никак не могу это сделать, буду благодарен за помощь.

with 
first_rows as 
 ( 
     select LISTAGG(t.DEVNAME , ',') WITHIN GROUP (ORDER BY 1) first_dev
     from ( select t.DEVNAME,   
     row_number () over (partition by keys order by SEQUENCE) rn_asc 
     from ASU_DEVICES t
     where t.keys = 'STIG6JGK'
     ) t 
     where rn_asc <= 2 
 ),
 last_rows as 
 (
     select LISTAGG(t.DEVNAME , ',') WITHIN GROUP (ORDER BY 1) last_dev
     from ( select t.DEVNAME,   
     row_number () over (partition by keys order by SEQUENCE desc) rn_desc 
     from ASU_DEVICES t
     where t.keys = 'STIG6JGK'
     ) t 
     where rn_desc <= 2 
 )
select first_dev || ' ' || unistr('\2192') || ' ' || last_dev 
from first_rows cross join last_rows;

Демо вот здесь http://sqlfiddle.com/#!4/f1bb7/6


Ответы (1 шт):

Автор решения: Mike
select keys,
       max(case when rn_asc=1 then DEVNAME end) ||','|| max(case when rn_asc=2 then DEVNAME end)
       || ' ' || unistr('\2192') || ' ' ||
       max(case when rn_desc=1 then DEVNAME end) ||','|| max(case when rn_desc=2 then DEVNAME end)
  from (
     select t.keys, t.DEVNAME,   
            row_number () over (partition by keys order by SEQUENCE) rn_asc,
            row_number () over (partition by keys order by SEQUENCE desc) rn_desc
            from ASU_DEVICES t
  ) t 
 where rn_asc <= 2 or rn_desc <= 2
 group by keys

Пример на sqlfiddle.com

→ Ссылка