(SQL) Транспонирование строк в столбец с использованием RANK OVER возвращает только один случай из двух идентичных записей - PullRequest
0 голосов
/ 05 апреля 2020

Я использую oracle встроенную таблицу HR.JOB_DETAILS. Я хотел бы, чтобы все записи появлялись после транспонирования строк в столбцы для столбцов detamet_id и job_id, но для одного значения (ST_CLERK) для Department_id = 50 в исходной таблице есть 2 записи, но это происходит только один раз в конечном результате.

В подзапросе запрашивается минимальное значение для определенных столбцов, которые передаются - это ясно. Но я не могу найти решение, чтобы вернуть оба случая.

Исходная таблица:

Source table

Используемый запрос:

select a, b, c, d, e, f from (
select min("20") a, min("50") b, min ("60") c, min ("80") d, min("90") e, min("110") f from (
      select 
case when department_id=20 then job_id end as "20" ,
case when department_id=50 then job_id end as "50" ,
case when department_id=60 then job_id end as "60" ,
case when department_id=80 then job_id end as "80" ,
case when department_id=90 then job_id end as "90" ,
case when department_id=110 then job_id end as "110",
rank() over (partition by department_id order by job_id) as row_num
from job_history) x
group by row_num);

Результат:

enter image description here

1 Ответ

1 голос
/ 05 апреля 2020

Вместо этого используйте row_number():

row_number() over (partition by department_id order by job_id) as row_num

rank() возвращает то же значение для дубликатов, которое group by объединит в одну строку. row_number() гарантированно возвращает другое значение, поэтому они не будут объединены.

...