#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. Это сработало должным образом и дало именно то, что я искал, так что спасибо вам за это! В идеальной ситуации я бы хотел что-то, что сможет выполнить это без необходимости предполагать что-либо ранее.