Найдите пользователя, который увеличил количество часов трансляций с предыдущего календарного месяца - PullRequest
0 голосов
/ 11 июля 2020

Эта таблица представляет собой событие отслеживания «пульса», где каждую минуту создается одна строка для каждого стримера, пока этот стример активен. Если стример работает 60 минут, в этой таблице будет сгенерировано 60 строк

Create Table minute_streamed
(
     time_minute datetime ,
     username varchar(50) ,
     category varchar(50) ,
     concurrent_viewers int
)
    
Insert into minute_streamed values ('2020-03-18 12:00:00', 'alex','Fornite',125) ; 
Insert into minute_streamed values ('2020-03-18 12:01:00', 'alex','Fornite',130) ; 
Insert into minute_streamed values ('2020-03-19 15:30:00', 'jamie','Just Chatting',13) ; 
Insert into minute_streamed values ('2020-03-19 15:31:00', 'jamie','Food & Drink',15) ; 
Insert into minute_streamed values ('2020-03-20 10:30:00', 'rick','Call of Duty: Black Ops',150) ; 
Insert into minute_streamed values ('2020-03-20 10:31:00', 'rick','Call of Duty: Modern Warfare',120) ;
Insert into minute_streamed values ('2020-04-21 09:30:00', 'rick','Fornite',120) ;
Insert into minute_streamed values ('2020-04-20 10:31:00', 'rick','Call of Duty: Modern Warfare',120) ;
Insert into minute_streamed values ('2020-04-21 09:30:00', 'rick','Fornite',120) ;
Insert into minute_streamed values ('2020-04-20 10:31:00', 'jamie','Call of Duty: Modern Warfare',120) ;
Insert into minute_streamed values ('2020-04-21 09:30:00', 'jamie','Fornite',120) ;
Insert into minute_streamed values ('2020-04-18 12:00:00', 'alex','Fornite',125) ; 
Insert into minute_streamed values ('2020-04-18 12:01:00', 'alex','Fornite',130) ; 
Insert into minute_streamed values ('2020-06-18 14:00:00', 'alex','Fornite',120) ; 

У Alex есть две записи в марте. Это означает, что он транслировал 2 минуты. Таким образом, его часовая трансляция в марте будет 2/60.

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

Например, у Alex есть две записи за март, две записи за апрель и одна запись за июнь. Итак, он транслировал 2 минуты в марте (потому что у него две записи), 2 минуты в апреле и 1 минуту в июне. Я хочу сравнить его последний месяц, июнь, и предыдущий календарный месяц. В данном случае предыдущий календарный месяц - май, который Алексей не транслировал. Так что я должен сказать, что он не стримил в мае, а стримил в июне. Итак, он увеличил свою потоковую передачу по сравнению с предыдущим календарным месяцем

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


select
     *
from(   
select
    *
    ,lag(total_monthly_hours,1) over(partition by username order by year,month) as prev_month
from(   
select
     username
    ,year(time_minute) as year
    ,month(time_minute) as month
    ,count(*)/60 as total_monthly_hours
from minute_streamed
group by year(time_minute), month(time_minute), username
order by month(time_minute) desc ) as temp ) as temp2
where total_monthly_hours > prev_month

1 Ответ

1 голос
/ 11 июля 2020

Если я правильно понял, вы хотите сравнить как предыдущее значение, так и предыдущий период времени. Один из способов сделать это - вычислить «количество месяцев», умножив год на 12 и прибавив номер месяца. Затем вы можете увидеть, получает ли lag() значение из предыдущей строки:

select uym.*
from (select uym.*,
             lag(total_monthly_hours) over (partition by username order by year, month) as prev_total_monthly_hours,
             lag(month_cnt) over (partition by username order by year, month) as prev_month_cnt
      from (select username,
                   year(time_minute) as year,
                   month(time_minute) as month,
                   year(time_minute) * 12 + month(time_minute) as month_cnt,
                   count(*)/60 as total_monthly_hours
            from minute_streamed
            group by year(time_minute), month(time_minute), username, month_cnt
           ) uym
     ) uym
where prev_month_cnt is null or
      prev_month_cnt <> month_cnt - 1 or
      (prev_month_cnt = month_cnt - 1 and prev_total_monthly_hours < total_monthly_hours);

Здесь - это скрипт db <>.

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