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为222.03对应releaseRank为322.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
相关产品推荐
相关产品推荐

