Создание динамического запроса c по дате в SQL - PullRequest
0 голосов
/ 19 июня 2020

Вопрос : Мы хотим, чтобы наши посылки были доставлены вовремя. Следовательно, нам нужна метрика c, называемая OTD.

Для заданного дня t OTD - это скорость, с которой пакеты были доставлены вовремя для пакетов, созданных за 30 дней, предшествующих t.

Мы не только хотим знать сегодняшний OTD, но мы хотим знать OTD для каждой даты за последние 60 дней.

В нашем распоряжении есть три таблицы (не все могут понадобиться):

пакеты таблица: Столбцы: id, createdat, sellerid, prom_date, deliveryat

Строки: каждая строка представляет собой пакет, который должна выполнить компания доставки.

Обратите внимание, что обещание_дате - это дата, к которой пакет должен быть доставлен, чтобы его можно было считать своевременным. Кроме того, deliveryat - это отметка времени, когда посылка была доставлена ​​- если посылка еще не была доставлена, значение будет NULL.

продавец таблица: Столбцы: id, name Строки : Каждая строка - это продавец, который создал учетную запись в компании доставки.

календарь таблица: Столбцы: date, day_of_week Строки: Каждая строка представляет собой дату с 01.01.2010 по 2100 -01-01. Целевой вывод содержит: Столбцы: date, otd

Строки: Каждая строка представляет собой снимок даты для дат в диапазоне от 60 дней a go до сегодняшнего дня.

Результирующий набор данных: Запись запрос, который производит этот вывод для единственного идентификатора продавца "123" .

таблица пакетов выглядит следующим образом

Мой запрос; Где я застрял :

SELECT  curdate(),(sum(case when promise_date=date(delivered_at) then 1 else 0 end)/count(*))*100 "On-Time Delivery Rate (%)"
from packages p inner join seller s on p.seller_id=s.id
where p.seller_id=123 and date(created_at) between DATE_SUB(curdate(),interval 30 day) and DATE_SUB(curdate(),interval 1 day);

Результат моего запроса

Что нам действительно нужно : Нам нужна текущая дата и 59 дат до текущей дата и скорость доставки на каждый день (скорость OTD = количество своевременных доставок за последние 30 дней / общее количество доставок)

...