sql刷题常用函数

ROW_NUMBER()OVER (PARTITION BY ... ORDER BY ...) 是一个窗口函数,用于生成每个分组内的唯一行号。这个函数非常适合在分组数据中进行排序,并为每一行分配一个序号。下面是对你的具体示例的详细解释:

sql 复制代码
ROW_NUMBER() OVER (
    PARTITION BY MONTH(p.fdate)
    ORDER BY COUNT(p.user_id) DESC, s.song_id
) AS song_rank

详细解释:

  1. ROW_NUMBER():

    • 这是一个窗口函数,用于为查询结果中的每一行生成一个唯一的行号。
  2. OVER (...):

    • 这是窗口函数的语法部分,用于指定如何计算行号。它可以包括 PARTITION BYORDER BY 子句。
  3. PARTITION BY MONTH(p.fdate):

    • 这个子句指定了如何将数据分组。PARTITION BY 将结果集分成不同的分区或组,在每个分区内,ROW_NUMBER() 函数将计算行号。
    • 在你的示例中,MONTH(p.fdate) 意味着数据将按月份分组。这意味着每个月的数据都会被单独处理,ROW_NUMBER() 函数会在每个月的数据中生成行号。
  4. ORDER BY COUNT(p.user_id) DESC, s.song_id:

    • 这个子句定义了在每个分区内如何对行进行排序,然后为每行分配行号。
    • COUNT(p.user_id) DESC:首先按 COUNT(p.user_id) 的降序进行排序。COUNT(p.user_id) 是每首歌曲在特定月份的播放次数,这样播放次数最多的歌曲会排在前面。
    • s.song_id:在播放次数相同的情况下,按 s.song_id 进行升序排序。这里 s.song_id 作为次级排序条件,确保每个歌曲在播放次数相同的情况下有一个唯一的排序。
  5. AS song_rank:

    • AS 用于为计算出的行号分配一个别名。在你的查询中,这个别名是 song_rank。它表示每首歌在每个月中的排名。

CONCAT()

  1. CONCAT(ROUND(COUNT(l.overdue_days) / COUNT(*) * 100, 1), '%') AS overdue_ratio

    • COUNT(l.overdue_days):计算每个支付能力等级中有逾期记录的贷款数。
    • COUNT(*):计算每个支付能力等级中所有贷款的总数。
    • COUNT(l.overdue_days) / COUNT(*):计算逾期贷款占所有贷款的比例。
    • * 100:将比例转换为百分比。
    • ROUND(..., 1):将计算出的百分比四舍五入到小数点后一位。
    • CONCAT(..., '%'):将四舍五入后的百分比与 % 符号连接起来,生成如 25.5% 的格式。
    • AS overdue_ratio:给计算出的百分比结果指定别名 overdue_ratio
相关推荐
Csvn3 小时前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_5 小时前
MySQL SQL 调优完整指南
数据库·sql·mysql
Lethehong10 小时前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文
阿里云大数据AI技术18 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
jnrjian1 天前
psql 执行多个 sql 文件
数据库·sql
long3161 天前
PostgreSQL 学习资料大全:从入门到精通
java·数据库·sql·postgresql
阳光九叶草LXGZXJ1 天前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习
染指11101 天前
72.高级RAG-sql检索器
python·sql·mysql·llama·llamaindex·高级rag
long3161 天前
PostgreSQL 学习资料 · 入门 / 练习 / 精通 / 扩展
java·数据结构·数据库·spring boot·sql·postgresql·数据库开发
阳光九叶草LXGZXJ1 天前
达梦数据库-报错-12-[-7184]:对象定义[XXX]被修改,版本检查失败
linux·运维·服务器·数据库·sql·学习