как рассчитать тренд на основе событий

#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. Привет, Гордон, это идеально. не думал, что я так далеко .. просто не мог туда добраться