Значения из нескольких строк, перенесенные в одну строку (отдельные ячейки), если строки имеют совпадающие идентификаторы. Нулевые значения, если идентификатор существует только один раз

#sql #pivot #window-functions

#sql #сводная #окно-функции

Вопрос:

Относительно новичок в оконных функциях, но я почти уверен, что это то, что здесь нужно. Я пытаюсь объединить две или более строк, возвращаемых в наборе данных, которые используют один и тот же идентификатор / dense_rank в одну строку.

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

Посмотрите, как я хотел бы, чтобы выглядели конечные результаты и что я получаю в данный момент. Не уверен, будет ли это row_number или dense_rank. Спасибо! (запрос ниже).

 select 
DENSE_RANK() OVER(ORDER BY l.unit_key) AS ID,
l.unit_key, 
l.start_date,  
u.area, 
c.amount 

from unit_rt u
    join lease_rt l on u.unit_key = l.unit_key
    join charges_rt c on l.lease_key = c.lease_key
  

Текущие результаты > Желаемые результаты

Ответ №1:

Если я правильно вас понял, вы можете объединять и ранжировать одинаковые записи unit_key по возрастанию start_date , а затем сводить результирующий набор с помощью условной агрегации:

 select 
    unit_key,
    max(case when rn = 1 then l.start_date end) prior_lease_date,
    max(case when rn = 1 then u.area       end) prior_area,
    max(case when rn = 1 then c.amount     end) prior_amount,
    max(case when rn = 2 then l.start_date end) new_lease_date,
    max(case when rn = 2 then u.area       end) new_area,
    max(case when rn = 2 then c.amount     end) new_amount
from unit_rt u
inner join (
    select 
        l.*, 
        row_number() over(partition by l.unit_key order by l.start_date) rn
    from lease_rt l
) l on u.unit_key  = l.unit_key
inner join charges_rt c on l.lease_key = c.lease_key
group by l.unit_key
  

Обратите внимание, что это предполагает либо одну, либо две записи на unit_key только, как показано в ваших данных.

Комментарии:

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