自定义Rank(arg1,arg2)函数生成SQL及参数arg2用法的技术咨询
解决自定义Rank函数生成SQL的问题
首先,根据你描述的Rank(arg1, arg2)函数定义——基于数值字段arg1对行排名,并按唯一父字段arg2排序/分组,核心是明确arg2的作用:它要么用于分区(分组),要么作为全局排序的前置条件,以下是两种场景的具体实现:
场景1:按父字段arg2分组,组内对arg1排名(最符合“父字段”语义)
如果“按唯一父字段值排序”是指将相同arg2值的行归为一组,在组内基于arg1进行排名,需要用PARTITION BY子句指定arg2作为分区字段。
比如你的例子中,假设arg1是Salary,arg2是Department(Person表的父字段,比如部门),SQL写法如下:
SELECT Department, Salary, RANK() OVER(PARTITION BY Department ORDER BY Salary ASC) AS rank_result FROM Person;
这个语句会为每个部门单独计算工资排名,同一部门内工资相同的行获得相同排名。
场景2:全局先按arg2排序,再对arg1排名
如果“按唯一父字段值排序”是指全局结果先按arg2排序,再基于arg1生成连续排名,只需将arg2加入ORDER BY子句的首位:
SELECT Department, Salary, RANK() OVER(ORDER BY Department ASC, Salary ASC) AS rank_result FROM Person;
这个语句会先按部门排序,再在全局范围内按工资排名,不同部门的行也会参与同一排名序列。
你之前的SQL只用到了arg1(Salary),没有引入arg2,只需根据实际需求选择上述两种写法中的一种,将arg2对应到PARTITION BY或ORDER BY子句中即可。
内容的提问来源于stack exchange,提问作者Viena Vinod
相关产品推荐
相关产品推荐

