Убрать из запроса "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