根据列值完成序列排序值

时间:2013-12-16 02:24:05

标签: sql tsql sql-server-2012

给出: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是否可以工作?

只是寻找提示而不仅仅是答案。

1 个答案:

答案 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变量的最大值。这是作业的基础。

最后,您想要的值是序列号和最大顶部排序值的总和。