sql - 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 的字段类型有关吗?它需要转换为整数还是与字段的长度有关?
解决方案
因为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
推荐阅读
- linux - 当条件处于 ansible
- scala - 拆除 Akka 图时如何释放资源?
- javascript - 在引用 v-for 元素的属性时,在 v-for 元素上使用 v-bind:class ternary 造成混淆
- android - 视频无法在 Android (chrome) 和 iOS (safari) 上播放
- php - 为什么这行脚本不会将上传图像文件移动到期望目录?
- python - Python写入文件 - 英文转换为中文
- android - Android Wear 断开连接指示器
- azure - 在 Azure 自动化或 ADF 自定义活动中运行 Powershell 脚本?
- python - python中上下文包的导入错误
- c# - 如何配置在控制台应用程序中使用两个不同数据库的hangfire?