#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 |
Я хочу объединить эти две таблицы на основе двух критериев:
- Если дата покупки
- В противном случае верните максимальную цену(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 … Я неправильно понял вопрос.