You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KQL/Kusto如何生成同值同排名的类SQL row_number序号

Kusto 实现重复值同排名的版本排序方案

直接用serialize + row_number()只会逐行生成连续序号,无法对重复的release值归并排名,要实现同版本排名一致、按版本顺序递增的效果,直接用下面两种方法就能实现:


方法1:去重生成排名映射后关联(推荐)

先对release列去重,按版本排序后生成每个版本对应的唯一排名,再通过关联把排名映射回原表,逻辑清晰且不容易出现排序错误,适配绝大多数场景。

let T = datatable(release:string, metric:long)  
[
"22.05", 20,
"22.05", 21,
"22.04", 40,
"22.03", 50,
"22.01", 560
];
// 生成版本-排名映射表
let ReleaseRankMap = T
| distinct release
// 排序规则:新版本在前用desc,旧版本在前替换为asc
| sort by release desc 
| extend releaseRank = row_number()
;
// 关联回原表得到最终结果
T
| lookup ReleaseRankMap on release
| take 100

运行后输出结果符合预期:

  • 所有22.05版本的记录releaseRank均为1
  • 22.04对应releaseRank为2
  • 22.03对应releaseRank为3
  • 22.01对应releaseRank为4

方法2:窗口函数逐行累计计算

不需要额外做表关联,直接在排序后的数据集上通过累计求和实现排名:当前行版本和上一行不一致时累计值+1,一致则累计值不变,最终得到的累计值就是对应排名。

let T = datatable(release:string, metric:long)  
[
"22.05", 20,
"22.05", 21,
"22.04", 40,
"22.03", 50,
"22.01", 560
];
T
| sort by release desc
| extend lastRelease = prev(release, 1, "")
| extend releaseRank = row_cumsum(iff(lastRelease != release, 1, 0))
| project-away lastRelease
| take 100

注意事项

如果使用的版本号存在月份不补前导零(如22.9代表22年9月)、多段语义化版本(如23.1.2)的情况,直接按字符串排序会出现顺序错误,建议先将版本拆分为数值类型的段做多字段排序,或把版本格式统一为固定长度字符串后再排序,避免排名错乱。

内容的提问来源于stack exchange,提问作者novice8989

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:54:29