首页 > 解决方案 > SQL 等级和分区

问题描述

使用这个查询

SELECT STC.*, rank() over (partition by service_id order by service_tracking_id desc) rnk
FROM pntt.ntt_service_tracking_curr stc
where service_id in 
('61NA', 

响应是

rnk service_id service_tracking_id
1   61NA    7112415
2   61NA    5202885
3   61NA    44427875
4   61NA    2390953
5   61NA    117139
6   61NA    117138
7   61NA    10586781

为什么会这样排名?它与 Service_id 的字段类型有关吗?它需要转换为整数还是与字段的长度有关?

标签: sqlwindow-functions

解决方案


因为service_tracking_id是一个字符串,所以排序是字母而不是数字。

这是修复它的一种方法:

SELECT STC.*,
       rank() over (partition by service_id
                    order by length(service_tracking_id) desc, service_tracking_id desc  -- might be len
                    ) rnk

或者,将值转换为小数:

SELECT STC.*,
       rank() over (partition by service_id
                    order by cast(service_tracking_id as decimal(20, 2)) desc
                    ) rnk

推荐阅读