SQL Server 2010基于Low_Link零值分组并生成递增排名的问题
高效解决Low_Link零值触发的分组排名问题
嘿,我刚好处理过类似的大数据量分组场景,你的需求用窗口累计函数就能完美解决,完全不用那些低效的连接/联合迭代方案——毕竟178个零值的话,迭代方法的性能会崩得很惨。
核心思路
其实很简单:我们只需要给每一行标记“是否是分组起始点”(也就是Low_Link=0时标记为1,其他为0),然后对这个标记值做累计求和,得到的结果就是每个分组的递增排名ID。每次遇到Low_Link=0,累计值就加1,自然开启一个新分组,全程只需要扫描表一次,性能拉满。
具体SQL实现
假设你的表叫your_table,还有用来确定数据顺序的字段(比如主键、时间戳这类,必须有个排序字段才能保证分组顺序正确),代码如下:
SELECT *, -- 每次Low_Link=0时加1,累计求和得到分组排名 SUM(CASE WHEN Low_Link = 0 THEN 1 ELSE 0 END) OVER (ORDER BY your_sort_column) AS group_rank FROM your_table;
关键细节提醒
your_sort_column一定要替换成你的实际排序字段!比如如果你的数据是按时间顺序来的,就用时间字段;如果是按主键顺序,就用主键。没有排序规则的话,分组的顺序会乱,结果肯定不对。- 要是你的数据库支持,也可以用
COUNT(CASE WHEN Low_Link=0 THEN 1 END) OVER (ORDER BY your_sort_column),效果完全一样,选你顺手的就行。 - 这个方法不管你有多少个零值(哪怕几千个),性能都不会打折扣,因为它是单次扫描,比那些反复连接的方案高效太多了。
举个例子验证
比如你的原始数据是这样:
| Low_Link | content |
|---|---|
| 0 | 分组1开始 |
| 4 | 分组1内容 |
| 2 | 分组1内容 |
| 0 | 分组2开始 |
| 7 | 分组2内容 |
跑上面的SQL后,结果会是:
| Low_Link | content | group_rank |
|---|---|---|
| 0 | 分组1开始 | 1 |
| 4 | 分组1内容 | 1 |
| 2 | 分组1内容 | 1 |
| 0 | 分组2开始 | 2 |
| 7 | 分组2内容 | 2 |
完全符合你“遇到0就开新分组,排名递增”的要求。
内容的提问来源于stack exchange,提问作者rwould
相关产品推荐
相关产品推荐

