row_number函数用法

  • 1、函数讲解
  • 2、LeetCode实战

1、函数讲解

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说,row_number()从1开始,为每条分组记录返回一个数字,举例:

ROW_NUMBER() OVER(ORDER BY xlh DESC)

这里的用法是先将xlh列进行降序排序,再将降序后的每条记录返回一个序号。

row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
表示根据COL1分组,在分组内部根据COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

初始数据显示为:

我们的目标是根据部门进行分组,并显示每个部门的工资等级
SQL语句:

select * ,Row_number() OVER(partition by deptid order by salary DESC) rank
FORM employee

最终显示结果为:

2、LeetCode实战

题目是LeetCode上的题目:

编写一个sql查询,查找所有至少连续出现三次的数字。返回的结果表中的数据可以按任意顺序排列。
查询格式如下面的例子所示:

下面是具体是解题代码:

select distinct Num as ConsecutiveNums from
(select Num,count(1) as SerialCount from(select id,Num,row_number() over(order by id) - row_number() over(partition by Num order by Id) as SerialNumberSubGroupfrom Logs) as sub group by Num,SerialNumberSubGrouphaving count(1) >= 3) as res

上面的解题是参照题解里以为大佬的解题思路:
具体解题过程参照:
作者:neilsons
链接:https://leetcode-cn.com/problems/consecutive-numbers/solution/sql-server-jie-fa-by-neilsons/
原始数据:

1、对原始数据编号,从1开始使用 row_number() over(表达式) 函数,使用Id来排序既row_number()

SELECT Id,Num,
row_number() over(order by id) as SerialNum
FROM ContinueNumber

2、使用原始数据另一维度排序,这些num值一样的分组排序,然后对其编号同样使用row_number() over(表达式),参数:(num分组,id排序)row_number() over(partition by num order by id)

SELECT Id,Num,
ROW_NUMBER() over(partition by Num order by Id) as SerialGroup
FROM ContinueNumber


3、通过上述1和上述2 看一下有什么规律吗?两个列(SerialNum,SerialGroup)对应相减,只要连续,相减得到的值是一样的。不连续相减得到的值也不同。

SELECT Id,Num,row_number() over(order by id) -row_number() over(partition by Num order by Id) as SerialNumberSubGroupFROM ContinueNumber

4、通过上述3,通过列Num和列SerialNumberSubGroup分组,最后拿到Num,就是求得的数据,去重(distinct)指:有可能同一个数字在多处出现三次以上。

SELECT DISTINCT Num FROM (
SELECT Num,COUNT(1) as SerialCount FROM
(SELECT Id,Num,
row_number() over(order by id) -
ROW_NUMBER() over(partition by Num order by Id) as SerialNumberSubGroup
FROM ContinueNumber) as Sub
GROUP BY Num,SerialNumberSubGroup HAVING COUNT(1) >= 3) as Result

这个解题的核心是要想明白一个结论:如果一个num连续出现时,那么它出现的【真实序列】-它出现的次数一定是个定值。因为:

1、假设一个num出现后,它的 真实序列 为 i ,同时假设它是第 k 次出现的; 差值为 i-k.
2、当它连续出现一次时,它的 真实序列 一定为 i+1 ; 它的出现次数显然也会+1,为 k+1 ; 差值为 i+1-(k+1)=i-k.
3、当它连续出现第 n 次时,它的 真实序列 一定为 i+n;它出现的次数为 k+n;差值为 i+n-(k+n)=i-k.
4、如果它不连续出现,假设m个其他num出现之后,它又出现了,则它的真实序列为 i+n+m,而出现的次数为 k+n+1;差值为 i-k+m-1 。

所以,上述解题大佬的做法其实就是:
第一步重排的serialNum表示:这个num出现的真实序列,也就是说在原始数据中,它是第几个出现的;
第二步重排的serialGroup表示:这个num是第几次出现的;
然后其他的步骤就比较容易想了。

SQL中row_number函数用法相关推荐

  1. SQL中 ROW_NUMBER 函数的用法

    SQL中 ROW_NUMBER 函数的用法 ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号.在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是 ...

  2. SQL Server中row_number函数用法介绍

    一.SQL Server Row_number函数简介 ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 语法实例: ...

  3. Hive中row_number()函数用法详解及示例

    目录 一.Hive 中row_number()函数介绍 二.使用示例 三.总结 四.附录 在Oracle中,我们经常会用到row_number() over(partition by clo1 ord ...

  4. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  5. 教你学会Sql中 ROW_NUMBER的用法

    ROW_NUMBER SqlServer 2005 推出的新功能.语法:select *,ROW_Number() over(order by 字段) as '新列名' from table顾名思义: ...

  6. SQL中DECODE函数用法

    DECODE函数用法: DECODE(expr_expression, search_expression, result_expression, [default_expression]) 当sea ...

  7. Oracle的Cast的用法,cast函数(sql中cast函数用法)

    这是一个格式转换函数.里面有两个参数:cast[要转换的数据或公式 as 转换到的数据类型] 同类函数还有convert[数据类型,要转换的数据或公式] CAST()和CONVERT()函数的区别是什 ...

  8. SQL中SCOPE_IDENTITY()函数用法

    SCOPE_IDENTITY() 返回插入到同一作用域中的标识列内的最后一个标识值.常用做法为在插入数据后,通过此函数读取插入数据的标识. ' tb_User为数据库表名 select SCOPE_I ...

  9. SQL中object_id函数的用法

    SQL中object_id函数的用法 收藏  int object_id('objectname'); 此方法返回数据库对象标识号. 其中,参数objectname 表示要使用的对象,其数据类型为nc ...

最新文章

  1. 关于机房有八台计算出现E盘无法更改盘符的问题
  2. volatile和内存屏障(dmb)
  3. vue监听滚动开始与结束
  4. Excel 自定义关闭按钮
  5. java dom 获得子元素_在JavaScript中删除DOM节点的所有子元素
  6. php 漂亮的分页类
  7. 太火了!MyBatis-Plus为啥这么牛?
  8. dsp 链接命令文件的写法
  9. X265源码下载地址
  10. 永洪BI配置GIS地图的方法
  11. xprinter打印机android 开发文档,芯烨智能打印机,让手机功能更神奇
  12. 【最小开发板】Attiny85开发与实践
  13. 欧姆龙PLC的FINS协议解释(实测通过)
  14. html毕业答辩ppt模板范文,答辩ppt模板|答辩总结范文
  15. java Swing TXT文件分割程序
  16. babaliuliu游戏视频--选择1号角色初体验
  17. python标签打印_Python 实现自动完成A4标签排版打印功能
  18. Java --- JVM动态链接与方法调用
  19. 腾讯云服务器PAI项目管理,腾讯云——PAI节点创建教程
  20. 哪些 iOS 应用让你用了很满意并能提高生活质量?

热门文章

  1. Java程序员“找对象”攻虐
  2. vue3如何把导入后的excel文件解析出来
  3. vue+elementUI 超长文本省略显示,多余文字鼠标移入时显示全部
  4. 如何成功的做好服务销售
  5. 计算机主要学的是什么意思是,电脑超频是什么意思 超频对电脑的用处
  6. FFmpeg卸载旧版本,安装新版本详细步骤(更新FFmpeg)
  7. 怎么给视频配音?短视频作者在用的三种方法,简单易操作
  8. 江西农业大学计算机科学与技术分数线,2019年江西农业大学优势专业排名及分数线...
  9. NPDP|产品经理必须了解的商业模式画布
  10. V-show的正确使用方法