sql中rank()over()的使用方法

2 02 3 年,我的朋友问我一个关于 SQL 中 RANK() OVER() 函数的作用的问题。

我说了,这个函数是一个窗口函数,特别是用来对查询结果进行排序的。

具体请问如何使用?
我说了,基本语法是RANK() OVER(),你可以根据需要添加PARTITIONBY和ORDERBY。

再说一遍,什么是 PARTITIONBY?我说,这就像划分区域,把题目的结果分成几组,每组计算它的独立排名。

再说一遍,ORDERBY 是什么意思?
我说过,这决定了如何在分区内排序,升序 ASC 或降序 DESC。

他说,监禁的程度如何?
我说并行级别是指ORDER BY列值相同,这些行得到相同的级别,后续级别跳过并行数。

再说一遍,DENSE_RANK() 和 ROW_NUMBER() 之间有什么区别?
我提到过 DENSE_RANK() 不会跳过排名后的序列号,而 ROW_NUMBER() 会强制分配唯一的序列号,即使值相同。
他听完点点头,又问了一个例子。

我说,例如,如果你想按价格对所有产品进行排序并在全球范围内排名,你可以这样写: SELECTproduct_name,price,RANK()OVER(ORDERBYpriceDESC)ASprice_rankFROMproducts;
我说,这个可以这样写: SELECTstudent_id,class_id,score,RANK()OVER(PARTITIONBYclass_idORDERBYscoreDESC)ASclass_rankFROMexam_results;
他若有所思地点点头,然后这个工具确实不错,对数据分析很有帮助。

我说是的,但是你使用窗口函数的时候,你要注意性能影响和数据库兼容性。

我们应该注意什么?
我说当数据量很大的时候,需要考虑优化索引或者批量处理。
此外,虽然主要数据库都支持它,但语法细节可能略有不同。

我明白了,谢谢。

我说:“你好,请问还有什么要问的吗?”
他摇头说不是,你说清楚了。

从零开始学MySQL(二十一):排序函数和窗口配合使用

2 02 3 年,我的朋友在学习MySQL,发现排序和窗口函数的结合非常重要。
例如,RANK()、DENSE_RANK() 和 ROW_NUMBER() 各有其自己的用途。

上周,我帮朋友准备了一个游戏数据库,包括游戏表和game_purchase表,用于分析游戏热度和用户购买行为。

例如,RANK()函数查询最流行的游戏,发现如果有多个具有相同评级的游戏,RANK()会为这些游戏分配相同的序列号,但序列号不连续。

DENSE_RANK()函数,我用这个函数再次查询,发现它和RANK()类似,但是连续的序号被分配给相同的列值。
这在需要连续序列号的场景中特别有用。

我用ROW_NUMBER()再次尝试了ROW_NUMBER()函数,发现它为每一行分配了唯一的序列号,并且没有发生并行情况。
这适用于必须唯一标识每一行的情况。

通过这些练习,朋友对排序和开窗函数有了更深入的了解,也提高了SQL查询的效率和准确性。
掌握这些技能对于处理和分析大量数据非常重要。
不过朋友说,虽然有时会遇到数据量大或者查询条件变化等复杂的情况,但总体来说还是很满意的。
但我刚才想到的另一件事是,如果数据量真的很大,还需要考虑性能优化。
忘了它。
让我们暂时把这个问题放在一边,自己去寻找答案。

sql中如何排序结果集 结果集排序的两种经典方法

order by 子句和窗口函数,这两种方法在 SQL 中排序是很常见的。
下面我们来详细说说。

1 . 按条款排序 这是最基本的排序方法,直接使用即可。
您指定一列或多列,结果集将按此排序。
默认为升序。
如果要降序排列,请添加 DESC。

例如,按工资降序对员工进行排序: sql 选择 ID、姓名、工资 来自员工 按工资 DESC 排序;
如果按多列排序,则先按第一列排序,然后按第二列细化: sql 选择 ID、姓名、部门、工资 来自员工 ORDER BY 部门 ASC,薪资 DESC;
NULL值如何排列,不同的数据库有不同的规则。
有些在前面,有些在后面。
您可以显式指定 NULLSFIRST 或 NULLSLAST。

例如,如果工资为 NULL 的员工排名最后: sql 选择 ID、姓名、工资 来自员工 ORDER BY 工资 DESC NULLSLAST;
2 . 窗函数 这样更加灵活,适合复杂的场景。
RANK、DENSE_RANK 和 ROW_NUMBER 等函数可以在组内排序。

核心语法是这样使用的: sql 函数名称 () OVER (PARTITION BY 分组列 ORDER BY 排序列)
RANK 和 DENSE_RANK 之间存在很大差异。
RANK值相同的排名会被跳过,如1 、2 、2 、4 DENSE_RANK对相同值连续排名,如1 、2 、2 、3 无论ROW_NUMBER值是否相同,每一行都单独排名,1 、2 、3 、4
例如计算各部门员工的薪资排名: sql 选择 ID、姓名、部门、工资、 RANK() OVER (PARTITION BY部门 ORDER BY薪资 DESC) ASrank_within_dept 来自员工;
另一个例子是月销量排名前 5 名的产品的报告。
您可以使用 CTE: sql 排名销售额为 ( 选择产品 ID、月份、总销售额、 RANK() OVER (PARTITION BY Month ORDER BY Total_sales DESC) AS sales_rank 来自销售数据 ) 选择产品 ID、月份、总销售额 来自排名销售 其中 sales_rank <= 5 ;
三、性能及适用场景 Order by子句简单直接,排序速度快,可以直接使用索引。
但无法进行组内排序,也无法实现复杂的排序逻辑。

窗口函数支持组内排序,无需多次查询,适合复杂分析。
但语法复杂,数据量较大时可能会影响性能。

一般情况下,为了简单排序,使用Order by即可。
使用窗口函数在组内进行排名或分页。
哪一个更好取决于你的数据库和实际数据量,需要测试才知道。