Объединяйте значения в одной таблице только в том случае, если минимальное значение меньше значения в другой таблице — снежинка

#sql #snowflake-cloud-data-platform

Вопрос:

У меня есть два стола:

Таблица А

Дата покупки Product_ID
20200101 1
20190101 2
20200301 1
20201201 2

Таблица В

Product_ID Цена Price_change_date
1 10 20191231
2 15 20201031
1 12 20200110
1 20 20201231
2 8 20190331

Я хочу объединить эти две таблицы на основе двух критериев:

  1. Если дата покупки
  2. В противном случае верните максимальную цену(price_change_date), которая меньше даты покупки

Я написал запрос, чтобы успешно получить результаты по второму критерию, но не по первому, и я не уверен, можно ли их объединить в одном запросе.

Результаты для приведенной выше таблицы должны дать:

Результаты

Дата покупки Product_ID Цена Price_change_date
20200101 1 10 20191231
20190101 2 8 20190331
20200301 1 12 20200110
20201201 2 15 20201031

Обратите внимание, что вторая строка возвращает цену с датой покупки, которая предшествует дате изменения цены.

Заранее спасибо!!

Ответ №1:

Вы можете использовать боковое соединение:

 select a.*, b.*
from a, lateral
     (select b.*
      from b
      where b.product_id = a.product_id and b.price_change_date <= a.purchase_date
     order by b.price_change_date desc
     limit 1
    ) b;
 

Редактировать:

Выше приведена самая последняя информация об изменении цен. Если вам нужны записи a до первоначальной цены, вы можете использовать:

 select a.*
from a left join
     (select b.product_id, min(b.price_change_date) as min_price_change_date
      from b
      group by product_id
     ) b
     on a.purchase_date < b.price_change_date;
 

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

1. Привет, Гордон, я думаю, что это отвечает первому критерию, но не второму. Тем не менее, когда я попытался сделать это в snowflake, я получил сообщение об ошибке: Ошибка компиляции SQL: Неподдерживаемый тип подзапроса не может быть оценен

2. @SeanG17 . . . Вот что order by он делает.

3. Я все еще получаю ошибку SQL. Другая проблема заключается в том, что эти результаты также дадут мне цены на эти продукты с ценой, связанной с датой изменения цены, которая предшествует дате покупки. Я хочу использовать только цены на товары, которые имеют самую раннюю дату изменения цен ПОСЛЕ даты покупки.

4. @SeanG17 … Я неправильно понял вопрос.