您的位置:首页 > 数据 >
LeetCode实战:row_number函数用法
来源:CSDN 2023-02-03 09:56:07

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) rankFORM 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 SerialNumberSubGroup        from Logs    ) as sub     group by Num,SerialNumberSubGroup    having 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 SerialNumFROM 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 SerialGroupFROM 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 SerialNumberSubGroup      FROM 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 SerialNumberSubGroupFROM ContinueNumber) as SubGROUP 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是第几次出现的; 然后其他的步骤就比较容易想了。

关键词:
相关文章
今日观点!山西焦煤召开煤炭增产保供专题会议

今日观点!山西焦煤召开煤炭增产保供专题会议

  1月31日,山西焦煤召开煤炭增产保供专题会议,传达学习国家和省煤炭增产保供最新会议精神,协调解决一季度煤炭增产保供工作中存在的问题,更多

2023-02-02 11:55:36
世界时讯:关于修订印发《煤矿安全改造中央预算内投资专项管理办法》的通知

世界时讯:关于修订印发《煤矿安全改造中央预算内

国家发展改革委等部门关于修订印发《煤矿安全改造中央预算内投资专项管理办法》的通知发改能源规〔2023〕80号各省、自治区、直辖市、新疆生产更多

2023-02-02 11:16:35
世界微资讯!山西:2023年坚决完成电煤保供任务 产量13.65亿吨以上

世界微资讯!山西:2023年坚决完成电煤保供任务

  1月31日举行的2023年山西省能源工作会议,总结2022年能源工作,分析当前发展形势,部署今年工作任务。  会上,山西省能源局介绍,2022年更多

2023-02-02 10:01:00
开工加速度!煤炭企业开足马力增产保供|环球新要闻

开工加速度!煤炭企业开足马力增产保供|环球新要

  2月1日,来关注山西煤炭企业新年的生产情况。山西是我国能源大省,2022年煤炭产量达到13亿吨,位居全国第一。位于山西太原的官地煤矿是一更多

2023-02-02 10:11:28
2022年12月份宁波市煤炭价格下降

2022年12月份宁波市煤炭价格下降

  据宁波市重要生产资料市场监测系统监测,12月份,全市煤炭均价为117725元吨,环比下降2%。其中烟煤9305元吨,环比下降15%;无烟煤1424元吨更多

2023-02-02 09:53:41
全球热点评!1月第三周云南省煤炭价格环比小幅上涨

全球热点评!1月第三周云南省煤炭价格环比小幅上

  据商务部重要生产资料市场监测系统显示,上周(2023年1月16日-22日),云南省煤炭均价为1530元吨,环比上涨05%。其中,动力煤均价8501元吨更多

2023-02-02 10:02:12
每日看点!1月第四周陕西省煤炭均价微跌

每日看点!1月第四周陕西省煤炭均价微跌

  据商务部重要生产资料市场监测系统显示,1月21日至1月27日,陕西省煤炭均价16100元吨,环比下跌63%。其中:无烟煤18500元吨,环比下跌149%更多

2023-02-02 09:54:10
中国煤炭工业协会与日本石油天然气·金属矿物资源机构探讨合作

中国煤炭工业协会与日本石油天然气·金属矿物资源

  1月31日上午,中国煤炭工业协会国际合作部主任苏传荣一行拜会日本石油天然气·金属矿物资源机构北京办事处,与新任所长古谷寿之等举行会谈更多

2023-02-01 15:57:41
山西开年“数说”能源:煤炭增产保供兼顾“双碳”目标

山西开年“数说”能源:煤炭增产保供兼顾“双碳”

  今年煤炭增产不低于5%、将达1365亿吨,同时还要兼顾双碳。1月31日,能源大省山西开年即聚焦能源增产保供。  在2023年山西能源工作会上,更多

2023-02-01 10:54:02
2022年全国煤炭采选业营业收入突破4万亿元

2022年全国煤炭采选业营业收入突破4万亿元

  国家统计局31日发布消息,2022年,规模以上工业企业实现营业收入13791万亿元,比上年增长59%;发生营业成本11684万亿元,增长71%;营业收更多

2023-02-01 10:09:55