Агрегация по статусу подсчетов в SQL - PullRequest
1 голос
/ 08 мая 2020

Я имею дело с некоторыми данными журнала со статусом воспроизведения, которые включают play и end. Во время игры клиент будет сообщать play несколько раз, но когда появляется end, это означает, что игра заканчивается, например,

user_id  status  timestamp
   a      play    xxx
   a      play    xxx
   a      play    xxx
   a      end     xxx
   b      play    xxx
   b      end     xxx
   c      play    xxx
   c      play    xxx
   c      end     xxx
   a      play    xxx
   a      play    xxx
   a      end     xxx
   a      play    xxx
   a      end     xxx

Теперь я могу использовать row_number() для расчета количества user_id с играми со статусом более 2 play, например:

# I realize this is a wrong query...

select count(distinct user_id) as cnt_uid
    (select  
        user_id,status,timestamp, 
        row_number() over (partition by user_id, status, order by timestamp) as rn
    from tableA) a
    where rn>=2 

Но если мне нужно подсчитать количество игр со статусом более 2 play (например: user A имеет 2 игры с более чем 2 play статусом и user C имеет 1), как это сделать? Любая помощь приветствуется.

* PS: Ожидаемый результат - это просто количество игр со статусом более 2 play, а для данных, приведенных выше, результат 3.

1 Ответ

1 голос
/ 08 мая 2020

Вы можете определить «игры», используя совокупную сумму status = 'end'. Затем объедините и снова объедините:

select user_id, count(*) as games_with_2+_plays
from (select user_id, grp, count(*) as num_plays
      from (select t.*,
                   sum(case when status = 'end' then 1 else 0 end) over (partition by user_id order by timestamp) as grp
            from t
           ) t
      where status = 'play'
      group by user_id, grp
     )
where num_plays >= 2
group by user_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...