窗口函数、聚合函数和group by的结合使用

窗口函数、聚合函数和group by的结合使用

关于窗口函数的使用可以看我的另一篇文章SQL窗口函数

执行逻辑

在我们同时使用窗口函数、聚合函数group by时,sql语句的执行逻辑。

group by 最先起作用,按条件分组,然后在这个组内聚合函数发挥作用,统计数据,最后才是窗口函数对分完组之后的整体的数据再进行统计。

使用情况示例

牛客SQL159

  • 数组表一:
    在这里插入图片描述

  • 数据表二:
    在这里插入图片描述

  • 需求:计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量

    • 涨粉率=(加粉量 - 掉粉量) / 播放量。结果按创作者ID、总粉丝量升序排序。
    • if_follow-是否关注为1表示用户观看视频中关注了视频创作者,为0表示此次互动前后关注状态未发生变化,为2表示本次观看过程中取消了关注。
  • sql:

这道题主要的问题在于,我们如何统计每个作者的粉丝人数,想要统计每个作者在每个月的粉丝人数我们就必须对数据按作者和月份分组,但是分组之后我们需要统计的是之前月份的粉丝数累加和,这种情况我能想到的最好的办法就是窗口函数了,通过over ( order by ) 可以对排序的列,逐条累加计算统计出之前的粉丝数量累计和。

select
    B.author,
    date_format (A.start_time, '%Y-%m') month,
    format (
        (
            sum(if (A.if_follow = 1, 1, 0)) - sum(if (A.if_follow = 2, 1, 0))
        ) / count(*),
        3
    ) fans_growth_rate,
    sum(
        sum(
            case
                when A.if_follow = 1 then 1
                when A.if_follow = 2 then -1
                else 0
            end
        )
    ) over (
        partition by
            author
        order by
            date_format (A.start_time, '%Y-%m') asc
    ) total_fans
from
    tb_user_video_log A
    inner join tb_video_info B on A.video_id = B.video_id
where
    year (A.start_time) = 2021
group by
    B.author,
    date_format (A.start_time, '%Y-%m')
order by
    B.author asc,
    total_fans asc
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值