как объединить две разные временные шкалы в SQL

#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 или Интернет в целом о том, как эмулировать отсутствующую функцию в вашей СУБД.