SQL: соединение с равным ключом и ближайшим ключом (аналогично слиянию Pandas на момент) - PullRequest
0 голосов
/ 21 октября 2019

Например, у меня есть две такие таблицы

![enter image description here

Для каждой строки в таблице 1 я хочу получить строку с

  • то же customer id и

  • ближайший date (в моем случае table2.date < table1.date)

Результат должен выглядеть следующим образом

enter image description here

Как я могу сделать это в SQL? Я пытался искать, но не нашел много вещей, связанных. и что, если я хочу изменить условие на <=, >= или >?

Спасибо!

Примечание:

  • пожалуйста, используя стандартныеSQL, поскольку я не использую PostgreSQL
  • Если я смогу использовать Python, я мог бы просто сойти с цикла for.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Вы можете использовать lateral join для этого:

select t1.*, t2.*  -- choose the columns you want
from table1 t1 left join lateral
     (select t2.
      from table2 t2
      where t2.customer_id = t1.customer_id and
            t2.date < t1.date  -- do you really mean <= ?
      order by t2.date desc
      limit 1
     ) t2;
1 голос
/ 21 октября 2019

Я согласен с Гордоном - боковое соединение - лучшее решение.

Если боковое соединение не поддерживается, решение на основе оконной функции может пригодиться.

with table1 (order_id, customer_id, date) as (
  select 1, 1, date '2019-10-10' union
  select 2, 1, date '2019-10-11' union
  select 3, 2, date '2019-10-11' union
  select 4, 2, date '2019-10-12' union
  select 5, 3, date '2019-10-12'
), table2 (order_id, customer_id, date) as (
  select  8, 1, date '2019-10-08' union
  select  9, 1, date '2019-10-09' union
  select 10, 1, date '2019-10-10' union
  select 11, 2, date '2019-10-10' union
  select 11, 2, date '2019-10-10' union
  select 11, 2, date '2019-10-10'
), all_rows as (
  select t1.*, t2.*, row_number() over (partition by t1.order_id order by t2.date desc) rn
  from table1 t1
  left join table2 t2 on t1.customer_id = t2.customer_id and t2.date < t1.date
)
select * from all_rows where rn = 1
...