Счетчик различий с использованием Over Partition By - PullRequest
0 голосов
/ 07 июня 2019

У меня есть набор данных с идентификаторами пользователей, которые со временем совершали покупки.Я хотел бы показать отчетливое количество пользователей, совершивших покупку, с разбивкой по штатам и странам.Вывод будет иметь 4 столбца: Страна, Штат, Год, Месяц, YTD Количество отдельных пользователей с покупательской активностью.

Есть ли способ сделать это?Следующий код работает, когда я исключаю месяц из представления и выполняю разные подсчеты:

Select Year, Country, State,
   COUNT(DISTINCT (CASE WHEN ActiveUserFlag > 0 THEN MBR_ID END)) AS YTD_Active_Member_Count
From MemberActivity
Where Month <= 5
Group By 1,2,3;

Проблема возникает, когда пользователь совершает покупки за несколько месяцев, потому что я не могу агрегировать на месячном уровнесумма, потому что он дублирует количество пользователей.

Мне нужно увидеть счет с начала года для каждого месяца года, для целей тенденций.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Верните каждого участника только один раз за первый месяц, когда он совершил покупку, сосчитайте по месяцам, а затем примените кумулятивную сумму:

select Year, Country, State, month,
   sum(cnt)
   over (partition by Year, Country, State
         order by month
         rows unbounded preceding) AS YTD_Active_Member_Count
from
  (
    Select Year, Country, State, month,
       COUNT(*) as cnt -- 1st purchses per month
    From 
     ( -- this assumes there's at least one new active member per year/month/country
       -- otherwise there would be mising rows 
       Select *
       from MemberActivity
       where ActiveUserFlag > 0 -- only active members
         and Month <= 5
         -- and year = 2019 -- seems to be for this year only
       qualify row_number() -- only first purchase per member/year
               over (partition by MBR_ID, year
                     order by month --? probably there's a purchase_date) = 1
     ) as dt
    group by 1,2,3,4
 ) as dt
;
0 голосов
/ 07 июня 2019

Количество пользователей за первый месяц их появления:

select Country, State, year, month,
       sum(case when ActiveUserFlag > 0 and seqnum = 1 then 1 else 0 end) as YTD_Active_Member_Count
from (select ma.*,
             row_number() over (partition by year order by month) as seqnum
      from MemberActivity ma
     ) ma
where Month <= 5
group by Country, State, year, month;
...