Улей скользящая сумма данных за дату - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над Hive, и у меня возникла проблема с счетчиками.Пример данных, над которыми я работаю, показан ниже:

enter image description here

, и ожидаемый результат такой, как показано ниже:

enter image description here

Я пытался использовать следующий запрос, но он не возвращает скользящий счет:

select event_dt,status, count(distinct account) from
(select *, row_number() over (partition by account order by event_dt 
desc) 
as rnum from table.A 
where event_dt between '2018-05-02' and '2018-05-04') x where rnum =1 
group by event_dt, status;

Пожалуйста, помогите мне с этим, если кто-то решиланалогичная проблема.

1 Ответ

0 голосов
/ 22 сентября 2018

Вы, похоже, просто хотите условную агрегацию:

select event_dt,
       sum(case when status = 'Registered' then 1 else 0 end) as registered,
       sum(case when status = 'active_acct' then 1 else 0 end) as active_acct,
       sum(case when status = 'suspended' then 1 else 0 end) as suspended,
       sum(case when status = 'reactive' then 1 else 0 end) as reactive
from table.A 
group by event_dt
order by event_dt;

РЕДАКТИРОВАТЬ:

Это сложная проблема.Решение, которое я придумала, создает перекрестное произведение дат и пользователей, а затем вычисляет самый последний статус на каждую дату.

Итак:

select a.event_dt,
       sum(case when aa.status = 'Registered' then 1 else 0 end) as registered,
       sum(case when aa.status = 'active_acct' then 1 else 0 end) as active_acct,
       sum(case when aa.status = 'suspended' then 1 else 0 end) as suspended,
       sum(case when aa.status = 'reactive' then 1 else 0 end) as reactive
from (select d.event_dt, ac.account, a.status,
             max(case when a.status is not null then a.timestamp end) over (partition by ac.account order by d.event_dt) as last_status_timestamp
      from (select distinct event_dt from table.A) d cross join
           (select distinct account from table.A) ac left join
           (select a.*,
                   row_number() over (partition by account, event_dt order by timestamp desc) as seqnum
            from table.A a
           ) a
           on a.event_dt = d.event_dt and
              a.account = ac.account and
              a.seqnum = 1  -- get the last one on the date
     ) a left join
     table.A aa
     on aa.timestamp = a.last_status_timestamp and
        aa.account = a.account
group by d.event_dt
order by d.event_dt;

Что это делаетсоздает производную таблицу со строками для всех учетных записей и дат.Он имеет статус в определенные дни, но не во все дни.

Совокупный максимум для last_status_timestamp вычисляет самую последнюю временную метку, которая имеет действительный статус.Затем он присоединяется к таблице, чтобы получить статус на эту дату.Вуаля!Это состояние, используемое для условного агрегирования.

Совокупный максимум и объединение - это обходной путь, потому что Hive (пока?) Не поддерживает параметр ignore nulls в lag().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...