#sql
#sql
Вопрос:
Я должен попытаться рассчитать тренд для клиентов на основе следующего:
любые 2 экземпляра 0 продаж за 4-недельный период.
Например —
Между 27 и 36 неделями в этом конкретном магазине 0 продаж между 27 и 32 неделями. Затем продажи производятся между 33 и 35 неделями, 0 продаж на последней неделе.
Мой полный набор данных содержит несколько хранилищ для каждого человека (сокращено для ясности в объяснении).
Результат, который я ищу
Мне нужна сумма по лицам, по неделям, из всех магазинов, в которых за последние 4 недели было 2 экземпляра 0 продаж.
Итак, для этого магазина я бы ожидал увидеть значение 1 для недель с 27 по 34 неделю, так как для каждой недели в этот период на этой неделе и в предыдущие 3 недели было не менее 2 случаев 0 продаж.
Недели 35 и 36 должны быть равны 0, так как эти 2 недели обе имеют продажи как минимум 3 из 4 недель.
Я понял это до сих пор, но это не совсем правильно…
http://sqlfiddle.com /#!18/586cf9/10
WITH
SourceData AS (
SELECT CustomerId, Person, Year, Week,
TotalSales,
CASE WHEN TotalSales = 0 THEN 1 ELSE 0 END AS ZeroSale,
LAG(
CASE WHEN TotalSales = 0 THEN 1 ELSE 0 END, 4)
OVER (Partition By customerId order by year, week ) AS Lagg
FROM sales
)
SELECT CustomerId, Person, Year, Week, CAST(totalSales AS int) AS TotalSales, ZeroSale, lagg,
CASE WHEN SUM (lagg )<=2 THEN 1 ELSE 0 END AS includedinfigures
FROM SourceData
GROUP BY CustomerId, Person, Year, Week, CAST(totalSales AS int), ZeroSale, lagg
Любая помощь будет оценена…
Комментарии:
1. Отредактируйте свой вопрос и укажите тег базы данных и покажите результаты, которые вы хотите. Я не могу понять, какие результаты вы хотите.
Ответ №1:
Если я правильно понимаю, вам нужен флаг, основанный на совокупном количестве (в предыдущих четырех строках) нулевых продаж. Если это так, вы можете использовать оконные функции:
select s.*,
(case when sum(case when TotalSales = 0 then 1 else 0 end) over
(partition by customerid, person
order by year, week
rows between 3 preceding and current row
) >= 2
then 1 else 0
end) as flag
from Sales s;
Вот db<>скрипка.
Комментарии:
1. Привет, Гордон, это идеально. не думал, что я так далеко .. просто не мог туда добраться