给出:demo here
OneTable
Id,GroupId,TopId,TopSort
-------------------------
1,1,101,2
2,1,101,2
3,1,102,1
4,1,102,1
5,1,103,null
6,1,103,null
7,1,104,null
8,1,104,null
在TopSort列中完成空值的现有序列的最佳方法是什么?如果所有TopSort值都为null,则根据Id列升序启动序列。
例如,
上面应如下所示:
OneTable
Id,GroupId,TopId,TopSort
-------------------------
1,1,101,2
2,1,101,2
3,1,102,1
4,1,102,1
5,1,103,3
6,1,103,3
7,1,104,4
8,1,104,4
加成: 如果所有TopSort值都为null,那么相同的SQL是否可以工作?
只是寻找提示而不仅仅是答案。
答案 0 :(得分:0)
您想要获取现有的排序值,然后更新值。我想你可以这样做:
with toupdate as (
select t.*,
dense_rank() over (partition by TopSort order by TopId) as seqnum,
max(case when TopSort is not null then TopSort end) over () as maxts
from tracker t
)
update toupdate
set TopId = coalesce(maxts, 0) + seqnum
where TopId is Null;
这可能有点难以理解。变量seqnum
根据TopId为行分配序号。 TopSort
为NULL时的值从1开始并从那里继续。这些是将要使用的唯一值。
列maxts
获取数据中TopSort
变量的最大值。这是作业的基础。
最后,您想要的值是序列号和最大顶部排序值的总和。