Запрос справки о том, как сгруппировать счетчики нескольких условий в одном запросе - PullRequest
1 голос
/ 30 апреля 2019

Мне нужно подсчитать количество подписчиков, даты вступления в силу которых предшествуют датам окончания месяцев, а даты окончания которых начинаются с даты первого месяца в течение определенного периода времени.Затем мне нужно сгруппировать эти результаты в отчет, отформатированный по годам и месяцам.Если подписчик стал подписчиком в 12 декабря 2009 года и является подписчиком до 12 декабря 2009 года, выходные данные должны отражать счетчик 1 за каждый месяц, в течение которого подписчик был бы действующим, и счетчик нуля в случае подписки.был неэффективен.Мне нужно подсчитать, где выполняется каждое условие, а не только где будет выполнено первое условие, например, как CASE .

Я использую SAS и пытался сделать это с помощью CASE WHEN, вручную создавая годмесячные группы, которые я хотел использовать для объединения подписчиков, которые удовлетворяли бы каждому условию WHEN.Я подозреваю, что это не достигнет того, на что я надеюсь, поскольку CASE завершает работу после выполнения первого условия, что исключает смысл этого упражнения.Мне нужно подсчитывать каждый год_месячный период, когда подписчик действует.С помощью CASE подсчитывается только первый месяц эффективной подписки, а остальная часть срока подписки исключается из подсчета из-за того, как работает CASE.

    create table subscriber_testing as
        select distinct
            case    
                when    sub_eff_date < '01Feb2018'd and sub_term_date >= '01Jan2018'd then '201801'
                when    sub_eff_date < '01Mar2018'd and sub_term_date >= '01Feb2018'd then '201802'
                when    sub_eff_date < '01Apr2018'd and sub_term_date >= '01Mar2018'd then '201803'
                when    sub_eff_date < '01May2018'd and sub_term_date >= '01Apr2018'd then '201804'
                when    sub_eff_date < '01Jun2018'd and sub_term_date >= '01May2018'd then '201805'
                when    sub_eff_date < '01Jul2018'd and sub_term_date >= '01Jun2018'd then '201806'
                when    sub_eff_date < '01Aug2018'd and sub_term_date >= '01Jul2018'd then '201807'
                when    sub_eff_date < '01Sep2018'd and sub_term_date >= '01Aug2018'd then '201808'
                when    sub_eff_date < '01Oct2018'd and sub_term_date >= '01Sep2018'd then '201809'
                when    sub_eff_date < '01Nov2018'd and sub_term_date >= '01Oct2018'd then '201810'
                when    sub_eff_date < '01Dec2018'd and sub_term_date >= '01Nov2018'd then '201811'
                when    sub_eff_date < '01Jan2019'd and sub_term_date >= '01Dec2018'd then '201812'
                when    sub_eff_date < '01Feb2019'd and sub_term_date >= '01Jan2019'd then '201901'
                when    sub_eff_date < '01Mar2019'd and sub_term_date >= '01Feb2019'd then '201902'
                when    sub_eff_date < '01Apr2019'd and sub_term_date >= '01Mar2019'd then '201903'
                else "n/a"
            end 
        as year_month,
            count(distinct subscriber_ID) as subscriber_count
        from
            prod.subscriber_detail      where
            subscriber_group like '%product_tx_%'
            and
            sub_term_date >= '01jan2018'd
            and
            sub_eff_date <= '31mar2019'd
;
quit;

Если бы я запрашивал одного подписчикарезультат должен привести к желаемому результату:


————————————————————————— * 101— * column1_year_month
201801
201802
201803
201804
201805
201806
201807
201808
201809
201810
201811
201812


column2_subscriber_count
0
1
1
1
1
1
1
1
1
0
0
————————————————————————

Как видно из набора результатов, мне также нужно сообщать нули длямесяцы, когда подписчиков нет.

Столбцы данных хранятся в одной таблице следующим образом:
Имя, Тип, Длина, Формат
Продуктuct, символ, 80, 80
Subscriber_ID, символ, 20, 20
Eff_Date, Date, 8, DATETIME22.3
Term_Date, Date, 8, DATETIME22.3

Функция COUNTIFв Excel справляется с этим нормально, но мне еще предстоит найти способ сделать это строго в СУБД.Я надеюсь найти решение, которое не зависит от СУБД.К сожалению, выражение CASE будет прекращено после выполнения условия.Что мне нужно, так это то, что подсчитывает каждое выполненное условие и позволяет мне сгруппировать эти подсчеты по месячному периоду, которому они соответствуют.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 30 апреля 2019
data date_months;
infile cards dlm=',' dsd;
input date1 :DATE9. date2 :DATE9.;
cards;
01Jan2018,01Feb2018
01Feb2018,01Mar2018
01Mar2018,01Apr2018
01Apr2018,01May2018
01May2018,01Jun2018
01Jun2018,01Jul2018
01Jul2018,01Aug2018
01Aug2018,01Sep2018
01Sep2018,01Oct2018
01Oct2018,01Nov2018
01Nov2018,01Dec2018
01Dec2018,01Jan2019
01Jan2019,01Feb2019
01Feb2019,01Mar2019
01Mar2019,01Apr2019
01Apr2019,01May2019
;
RUN;

PROC SQL;
create table subscriber_testing as
        select distinct
             a.Date1 as Year_Month,
            count(distinct subscriber_ID) as subscriber_count
        from
                date_months a
                left join prod.subscriber_detail b ON b.sub_eff_date < a.Date2 AND b.sub_term_date >= a.Date1
        where
            subscriber_group like '%product_tx_%'
            and
            sub_term_date >= '01jan2018'd
            and
            sub_eff_date <= '31mar2019'd
;
quit;

Отказ от ответственности: я давно не использовал SAS.

Если в вашей базе данных есть удобная таблица календаря, возможно, создайте таблицу 1-го дня месяца (date1) и добавьте 1 месяц к этой дате (date2).

...