使用RANK() OVER函数能否计算得出「最受欢迎」的指标?
RANK() OVER 计算线路受欢迎度可行性说明
首先明确结论:RANK() 开窗函数完全可以满足你当前业务场景的计算需求,仅需要先明确「受欢迎度」的可量化规则即可。
业务实现逻辑
你可以按照如下步骤完成计算:
- 第一步:过滤原始行程数据,排除所有时长超过2小时的无效记录
- 第二步:按线路维度分组聚合,分别计算每个线路的平均行程时长、受欢迎度指标(通常可选用线路总行程订单量/乘车人次,也可根据业务规则调整为其他可排序的数值指标)
- 第三步:过滤聚合结果,仅保留平均行程时长不低于8分钟的线路
- 第四步:使用
RANK() OVER对符合条件的线路按受欢迎度指标降序排序,排名为1的即为你要找的最受欢迎线路
参考SQL实现
WITH valid_trips AS ( -- 过滤时长超过2小时的行程(假设行程时长单位为分钟) SELECT * FROM trips WHERE trip_duration <= 120 ), line_agg AS ( -- 按线路聚合计算核心指标 SELECT line_id, line_name, AVG(trip_duration) AS avg_trip_duration, COUNT(DISTINCT trip_id) AS popularity -- 此处以有效订单量作为受欢迎度衡量标准,可按需调整 FROM valid_trips GROUP BY line_id, line_name ), qualified_line AS ( -- 筛选平均时长≥8分钟的线路 SELECT * FROM line_agg WHERE avg_trip_duration >= 8 ) -- 计算受欢迎度排名 SELECT *, RANK() OVER(ORDER BY popularity DESC) AS popularity_rank FROM qualified_line -- 若只需返回最受欢迎的线路,可额外加条件:WHERE popularity_rank = 1
补充说明
如果你需要处理并列排名的场景,可以根据业务需求选择不同的排序开窗函数:
- 用
RANK():保留并列排名,并列第一的多个线路都会返回1,下一名排名会跳空(比如两个第一之后下一名是3)- 用
DENSE_RANK():保留并列排名,排名不会跳空(两个第一之后下一名是2)- 用
ROW_NUMBER():不保留并列,相同指标也会按照规则生成唯一连续排名
内容的提问来源于stack exchange,提问作者Davidskis
相关产品推荐
相关产品推荐

