SQL Рассчитать кумулятивный счетчик Distinct в день с первого дня месяца - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть таблица со строками Дата, Сегмент, Площадь, Провинция и Billing_nbr.Я также хотел бы, чтобы число отличалось от Billing_nbr where total_revenue > 0 на основе даты в этой строке, возвращающейся к первому дню месяца (т. Е. Счет к месяцу).Это означает, что это должен быть кумулятивный счет всех billing_nbrs с первого дня месяца до даты наблюдения (которая является датой в каждой строке).Это означает, что если billing_nbr происходит в первый день, он также должен быть включен в счет за второй день, даже если он не встречается во второй день, но должен учитываться один раз, если это происходит в оба дня.И еще один нормальный счетчик Billing_nbr where total_revenue > 0, сгруппированный по другим столбцам.Ниже приведены данные, которые у меня есть:

enter image description here

У меня есть Присоединение ниже, но оно дает мне похожие цифры по обоим пунктам:

SELECT 
    MAIN_TABLE.*,
    TOT_SUBS_COUNT.N AS A1_SUBSCRIBERS_TOTAL,
    TOT_SUBS_COUNT_MTD.N AS TOTAL_MTD_A1_SUBSCRIBERS
FROM (
        select  
                ddate,
                SUM(TOTAL_REVENUE) AS REVENUE_TOTAL, 
                segment,
                province,
                area
        from CADA_PERMSISDN_DASHBOARD 
        GROUP BY province, area, segment, ddate
        order by ddate
) MAIN_TABLE
JOIN(
    select DDATE, count(DISTINCT BILLING_NBR) AS N, province, area, SEGMENT from CADA_PERMSISDN_DASHBOARD
    WHERE TOTAL_REVENUE > 0
    GROUP BY province, area, segment, ddate
    ORDER BY DDATE
) TOT_SUBS_COUNT ON MAIN_TABLE.DDATE = TOT_SUBS_COUNT.DDATE 
AND MAIN_TABLE.SEGMENT = TOT_SUBS_COUNT.SEGMENT 
AND MAIN_TABLE.PROVINCE = TOT_SUBS_COUNT.PROVINCE 
AND MAIN_TABLE.AREA = TOT_SUBS_COUNT.AREA
JOIN(
    select DDATE, count(DISTINCT BILLING_NBR) AS N, province, area, SEGMENT from CADA_PERMSISDN_DASHBOARD
    WHERE TOTAL_REVENUE > 0
    AND DDATE BETWEEN trunc((DDATE),'month') AND DDATE
    GROUP BY province, area, segment, ddate
    ORDER BY DDATE
) TOT_SUBS_COUNT_MTD ON MAIN_TABLE.DDATE = TOT_SUBS_COUNT_MTD.DDATE 
AND MAIN_TABLE.SEGMENT = TOT_SUBS_COUNT_MTD.SEGMENT
AND MAIN_TABLE.PROVINCE = TOT_SUBS_COUNT_MTD.PROVINCE 
AND MAIN_TABLE.AREA = TOT_SUBS_COUNT_MTD.AREA

Первое объединение предназначено для сгруппированного подсчета, а второе объединение - для совокупного подсчета с первого дня месяца до даты наблюдения (которая является датой каждой строки), и оно должно быть сгруппировано по другимколонны также.Столбцы подсчета имеют псевдонимы A1_SUBSCRIBERS_TOTAL и OTAL_MTD_A1_SUBSCRIBERS соответственно.Ниже приведены данные, которые я получаю, и, как вы не видите, у меня одинаковые значения в обоих столбцах:

enter image description here

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019
SELECT
TO_CHAR(A.ddate, 'YYYY-MM'), 
A.segment, 
A.province, 
A.area,
SUM(CASE WHEN total_revenue > 0 THEN 1 ELSE 0 END) TOTAL_GT_ZERO,
COUNT(*) TOTAL_SUBSCRIBERS
from CADA_PERMSISDN_DASHBOARD A
group by TO_CHAR(A.ddate, 'YYYY-MM'), A.segment, A.province, A.area

Из того, что я понял.Но можете ли вы предоставить то, что вы ожидаете?

0 голосов
/ 01 апреля 2019

Понятия не имею, какое отношение ваши данные имеют к запросу.Но для суммирования даты за месяц вы можете использовать аналитические функции, например:

select ddate, segment, province, area,
       sum(total_revenue) as revenue_total,
       sum(sum(total_revenue)) over (partition by trunc(ddate, 'MON') order by ddate) as mtd_revenue_total
from CADA_PERMSISDN_DASHBOARD 
group by province, area, segment, ddate
order by ddate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...