题解 | #每个创作者每月的涨粉率及截止当前的总粉丝量#

每个创作者每月的涨粉率及截止当前的总粉丝量

https://www.nowcoder.com/practice/d337c95650f640cca29c85201aecff84

# 计算每月的涨粉情况,总粉丝量就是累加窗口

# 创建临时表,查询必要的用户,年月,涨粉情况——1,-1,0
WITH temp_0 AS
    (
    SELECT author, DATE_FORMAT(start_time, '%Y-%m') the_month, 
        CASE WHEN if_follow = 1 THEN 1
            WHEN if_follow = 0 THEN 0
            ELSE -1 END fo_count
    FROM tb_video_info
    JOIN tb_user_video_log USING(video_id)
    )

# 总的粉丝量是指涨了多少粉,并不是最终得到的粉丝数,而是所有得到过的
# 查询用户,年月,涨粉率,这几个是常规操作
# 下面的是累计粉丝数,一眼就知道要用聚合窗口函数,但是在groupby里面不能用窗口函数,所以就在SUM外面又套了一层SUM,得到的结果并没有变,最后限制年份
# 使用嵌套的 SUM 可能是为了先在 GROUP BY 的级别上聚合数据,然后再使用窗口函数来计算每个作者的累积总和
SELECT author, the_month, ROUND(SUM(fo_count)/COUNT(*), 3) fans_growth_rate, 
SUM(SUM(CASE WHEN fo_count = 1 THEN 1 WHEN fo_count = -1 THEN -1 ELSE 0 END)) OVER(PARTITION BY author ORDER BY the_month) total_fans
FROM temp_0
WHERE LEFT(the_month, 4) = 2021
GROUP BY author, the_month
ORDER BY author, total_fans

原来可以嵌套聚合函数,这样就不与分组语句冲突了

当您在 SQL 查询中使用 SUM 聚合函数,并且同时使用了 GROUP BY 语句时,确实会有特定的规则和限制。在您的查询中,如果只使用一个 SUM 而出现错误,可能是因为 GROUP BY 语句与窗口函数的使用产生了冲突。让我们来探讨这两者之间的关系:

  1. 聚合函数与 GROUP BY:当您使用聚合函数(如 SUM, COUNT, AVG 等)时,这些函数通常是在 GROUP BY 语句的上下文中使用的。GROUP BY 语句用于指定如何将行分组为更小的集合,并且聚合函数会对每个这样的集合进行操作。
  2. 窗口函数:窗口函数(如 SUM(...) OVER (...))允许您在指定的数据窗口上执行计算,而不会合并行,它们保持原始行的数量。使用窗口函数时,您可以在不同的行上进行聚合操作,同时保留详细的行级数据。
  3. 冲突的原因:如果在 GROUP BY 子句的上下文中直接使用窗口函数,可能会导致逻辑冲突。因为 GROUP BY 试图将数据合并到组级,而窗口函数试图在更细粒度的级别上运行。在 GROUP BY 之后使用窗口函数通常是可以的,但直接将窗口函数应用于 GROUP BY 中的聚合结果可能会导致错误或不可预料的行为。

针对您的查询,如果只使用一个 SUM 而不是嵌套的 SUM(SUM(...)) OVER (...),您可能需要确保窗口函数的使用与 GROUP BY 子句不冲突。您的原始查询使用嵌套的 SUM 可能是为了先在 GROUP BY 的级别上聚合数据,然后再使用窗口函数来计算每个作者的累积总和。如果您移除其中一个 SUM,您可能就打破了这种逻辑,导致查询无法按照预期执行。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-23 18:34
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务