【问题标题】:complete the sequence sort values based on column values根据列值完成序列排序值
【发布时间】:2013-12-16 02:24:05
【问题描述】:

给定: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 值一开始都是空的,相同的 SQL 是否可以工作?

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

【问题讨论】:

  • 请解释一下“re-sequence”在您的情况下是什么意思。
  • 让我换个说法,说完成序列,如果所有基于 Id 的空序列。我换个话题。
  • 什么序列,你想怎么完成?
  • 从你的例子看来,你只是想要ORDER BY TopID, ID 如果这不正确,请提供另一个例子
  • 我建议逐步解释您的表格转换。

标签: sql tsql sql-server-2012


【解决方案1】:

您想要获取现有的最高排序值,然后更新这些值。我认为你可以这样做:

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

最后,你想要的值是序列号和最大排序值之和。

【讨论】:

    猜你喜欢
    • 2018-09-27
    • 2015-01-05
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多