Не думаю, что вам нужно использовать unpivot
.Чтобы получить самую последнюю дату, вы можете просто использовать функцию greatest()
.
В этом решении есть два подзапроса: один для расчета app_mon
для каждого нового клиента, а другой - для расчета самой ранней даты заказа для всех клиентов.кто разместил заказ в последние два года.Это может быть не самый эффективный подход, но ваш первый приоритет должен быть для получения правильного результата;если у вас есть это, вы можете настроить его при необходимости:
with cust as
(
select d.dist_id as id
, greatest(d.setup_dt, d.reinstate_dt, d.local_reinstate_dt) as app_mo
from mjensen_dev.gc_distributor d
where d.setup_dt >= date '2017-01-01'
or d.reinstate_dt >= date '2017-01-01'
or d.local_reinstate_dt >= date '2017-01-01'
) , ord as
(
select o.dist_id as id
, min(o.ord_dt) as ord_mon
, sum(o.oal) as ord_amt
from gc_orders o
where o.ord_dt >= date '2017-01-01'
group by o.dist_id
, trunc(o.ord_dt,'mm')
)
select cust.dist_id as id
, cust.app_mon
, ord.ord_mon
, floor(months_between(ord.ord_mon, cust.app_mon ) as mon_diff
, sum(o.oal) as ord_amt
from cust
inner join gc_orders o on cust.id = o.dist_id
order by 1, 2
/
Вы можете настроить его при моем расчете mon_diff
.Этот расчет обрабатывает 2018/2/1 - 2018/1/1 как разницу в один месяц.Потому что мне кажется странным, что клиент, который размещает заказ в день, к которому он присоединился, имеет mon_diff
1, а не ноль.Но если вы правильно сформулировали бизнес-правило, вам нужно будет добавить 1 к расчету.Точно так же я не включил trunc()
в обработку дат, но вы можете восстановить его.