MySQl 专栏持续更新 不说晦涩难懂的东西 尽量输出容易理解 和 使用的SQL技巧 和 初中级开发不是很常用的但很有用的知识
欢迎查看👉🏻👉🏻👉🏻SQL 专栏 查漏补缺 指教一二
前言
表结构在上一篇文章 需要的可以前往复制
表结构
需要了解的知识点
DATE_FORMAT
() 函数用于以不同的格式显示日期/时间数 在进行时间操作的时候可以使用这个函数进行时间的格式化操作
例如:
下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间:
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
结果类似:
Dec 29 2022 14:45 PM
12-04-2022
29 Dec 08
29 Dec 2022 16:25:46.635
这个在日常工作中 还算是比较有用的 因为 经常和时间进行打交道 如果不会使用这个函数 我们拿到数据到java 里面进行数据处理 肯定不是很好选择 还是需要去了解一下这个
- over窗口函数
这个我基本呢没有使用过 可能是之前没有去了解过着地方 但是我经常看到很多人 写SQL 都会使用这个函数 简单的了解一下
OVER开窗函数必须与聚合函数或排序函数一起使用,聚合函数一般指SUM(),MAX(),MIN,COUNT(),AVG()等常见函数。排序函数一般指RANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()等。
OVER的语法
OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )
PARTITION BY 子句进行分组;
ORDER BY 子句进行排序。
窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。
这个学名就是窗口函数 主要的作用即就是所有的数据都在窗口中 看这个概念还是比较抽象的
这个其实主要就是把数据单独拎出来处理
SUM(price) OVER (PARTITION BY name)
只对PARTITION BY后面的列name进行分组,分组后求解price的和。
SUM(price) OVER (PARTITION BY name ORDER BY ID)
对PARTITION BY后面的列name进行分组,然后按ORDER BY 后的ID进行排序,然后在组内对price进行累加处理。
****SUM(price) OVER (ORDER BY ID)
只对ORDER BY 后的ID内容进行排序,对排完序后的price进行累加处理。
****SUM(price) OVER ()
实战练习
问题
计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量
补充:
- 涨粉率=(加粉量 - 掉粉量) / 播放量。结果按创作者ID、总粉丝量升序排序。
- if_follow-是否关注为1表示用户观看视频中关注了视频创作者,为0表示此次互动前后关注状态未发生变化,为2表示本次观看过程中取消了关注。
感觉这个难度还是比较大的
分析思路
-
窗口函数是基于group by的数据进行聚合,而不是原表数据
-
第一层先行,在已经group by的表上先进行计算,得出sum = 2
-
第二层为正式的窗口函数,相当于 sum(第一层的结果) over ()
类比 max(某一列) over ()
- 为了让窗口函数更符合我们的结果输出,over的字句写上`partition by author,order by month
partition`让其对于用户进行分类汇总计算,order则表示以月份累加
完整SQL
SELECT
author,
month,
round(SUM(if_follow_num) / COUNT(*),3),
SUM(SUM(if_follow_num)) OVER (partition by author
order by month) "total_fans"
FROM (
SELECT
video_id,
DATE_FORMAT(start_time,"%Y-%m") "month",
CASE WHEN if_follow = 2 THEN -1
ELSE if_follow END "if_follow_num"
FROM tb_user_video_log vl
WHERE YEAR(start_time) = 2021) as a
INNER JOIN tb_video_info vi
ON a.video_id = vi.video_id
GROUP BY author,month
ORDER BY author,total_fans
第二种解题思路
第一个条件: 截止当前
使用到的函数: 窗口函数、sum
难点:
- 窗口函数 over 和 sum 以及一些函数的配合使用
1、统计每个用户的播放量、加粉量、掉粉量
- [条件]:year(start_time) = 2021
- [使用]:group by author,month;count
2、计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量
当月的总粉丝量 = (上个月)(加粉量 - 掉粉量) + 这个月(加粉量 - 掉粉量)
需要用到聚合窗口函数
- [使用]:sum(follow_add-follow_sub) over(partition by author order by month) 这个难度主要是在窗口函数 Over 的理解和使用方法上面
编写SQL
不了解 over 的使用这个是看不懂的
本文正在参加「金石计划 . 瓜分6万现金大奖」