#sql
Вопрос:
есть вопрос, который меня давно смущает;
У меня есть две таблицы журналов, в одной записан статус продажи продукта (для продажи=1, в противном случае=0),
другой записывает,что товара нет в наличии или нет(oos(нет в наличии)=1, в противном случае=0);
вот схема таблиц:
схема исходной таблицы и схема конечного результата
две временные линии должны объединить 1, и последняя из них является конечным результатом
Как получить этот результат с помощью SQL? Я пытался много раз, но все еще не могу получить ответы.
Комментарии:
1. Я удалил несовместимые теги базы данных. Пожалуйста, отмечайте только ту базу данных, которую вы действительно используете.
Ответ №1:
Сначала вы увидите FULL OUTER JOIN
две таблицы, чтобы узнать все время начала. Конечное время-это следующее время, с которым вы получите LEAD
. Для последней строки вы делаете это «23:59» COALESCE
.
Нули, которые вы получаете из-за полного соединения, означают «нет новой информации», поэтому вы получаете доступ к последней имеющейся информации, которую вы получаете LAST VALUE(... IGNORE NULLS)
.
select
sku,
utime as start_time,
coalesce(lead(utime) over (partition by sku order by utime), '23:59') as end_time,
last_value(sell.status ignore nulls) over (partition by sku order by utime) as sell_status,
last_value(stock.is_oos ignore nulls) over (partition by sku order by utime) as is_out_of_stock
from sell full outer join stock using (sku, utime)
order by sku, start_time;
Я не знаю, какую СУБД вы используете. Приведенный выше запрос является стандартным SQL. Ваша СУБД может поддерживать все упомянутые функции (например, Oracle), а может и не поддерживать (например, MySQL еще не поддерживает полные внешние соединения). Если в вашей СУБД отсутствуют функции, используемые в моем запросе, найдите stackoverflow или Интернет в целом о том, как эмулировать отсутствующую функцию в вашей СУБД.