【问题标题】:Find the user who increased their hours streamed from the previous calendar month查找从上一个日历月开始增加流式传输时间的用户
【发布时间】:2020-07-11 20:45:21
【问题描述】:

此表是一个“心跳”跟踪事件,其中在该流媒体直播时每分钟为每个流媒体生成一行。如果主播直播 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 分钟。因此,他 3 月的每小时流媒体播放量将是 2/60。

我正在尝试编写一个查询:对于每个日历月,输出从上一个日历月开始流式传输时间增加的主播列表

例如,Alex 有两个 3 月的条目,两个 4 月的条目,一个 6 月的条目。所以他在 3 月直播了 2 分钟(因为他有两个条目),4 月 2 分钟,6 月 1 分钟。我想比较他的最后一个月,也就是六月和上一个日历月。在这种情况下,上一个日历月是 5 月,Alex 没有直播。所以我需要说他在 5 月没有直播,他在 6 月直播。因此,与上一个日历月相比,他增加了流媒体

下面是我的代码,但我想将当前的流媒体播放时间与上一个日历月进行比较。你能帮忙修改我的查询吗?


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

【问题讨论】:

  • 小点为什么concurrent_viewers是一个你只加载整数的列,定义为一个VARCHAR?
  • 2/60 是什么意思?亚历克斯我没有效仿你的榜样。
  • 请忽略 concurrent_viewers @RiggsFolly。对于亚历克斯,他在三月份有两个条目。意思是他直播了 2 分钟。所以他三月份的每小时流将是 2 分钟 / 60 分钟(1 小时)
  • 你的主键是什么?
  • 不需要主键

标签: mysql sql


【解决方案1】:

如果我理解正确,您想比较之前的值和之前的时间段。一种方法是通过将年份乘以 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);

Here 是一个 dbfiddle。

【讨论】:

  • 不完全是。我们以 Username=Alex 为例,他有两个三月的条目,两个四月的条目,一个六月的条目。所以他在 3 月直播了 2 分钟(因为他有两个条目),4 月 2 分钟,6 月 1 分钟。我想比较他的最后一个月,也就是六月和上一个日历月。在这种情况下,上一个日历月是 5 月,Alex 没有直播。所以我需要说他在 5 月没有直播,他在 6 月直播。因此,与上一个日历月相比,他增加了流媒体。
  • 你看过 dbfiddle 了吗?这可以满足您的要求。
  • 是的,我做到了。我对“prev_month_cnt”列有点困惑。此外,对于 Alex,4 月条目未显示。您是否在“prev_month_cnt”列中显示 Alex April 条目?请进一步解释您的解决方案
  • @Eren 。 . . 4 月,Alex 有两个视图,与 March 相同,因此不符合条件。如果你也想允许平等,你可以使用&lt;=
  • 观看次数不是我们在这里寻找的。我想将他当前的每小时流与每个月的上一个日历月进行比较。尽管 Alex 在 5 月没有视图,但我如何将他的最后视图(即 6 月)与上一个日历月(5 月)进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2020-07-02
  • 2020-11-04
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多