【问题标题】:Add row_number to maximum value将 row_number 添加到最大值
【发布时间】:2015-10-31 06:50:57
【问题描述】:

这是我的问题的简化版本(我想不出一个在现实生活中有意义的例子)。

假设我有一个表人

桌人


ID       Name        Number     Category
1        Follett     null       Thriller
2        Rowling     null       Fantasy
3        Martin      80         Fantasy
4        Cage        55         Thriller
5        Baldacci    null       Thriller

现在我想得到以下结果:


ID       Name        Number     Category
1        Follett     56         Thriller
2        Rowling     81         Fantasy
3        Martin      80         Fantasy
4        Cage        55         Thriller
5        Baldacci    57         Thriller
  1. 按类别分组
  2. 选择每个类别的最大数值
  3. 将 row_number(按类别分区)添加到该数字并设置新值,(编辑:)但仅适用于之前为 null 的数字。

到目前为止我拥有的部分(不工作,更多地说明我想做的事情,我知道为什么这不可能工作)


UPDATE Person P
SET Number = sub.current + sub.row
FROM (
  SELECT
   Id,
   max(Number) as current,
   (ROW_NUMBER() OVER(PARTITION BY Category)) AS row
  FROM Person
  GROUP BY Category
) as sub
WHERE P.Id = sub.Id

注意:对于一个类别的所有数字都为空的极端情况,max(Number) 应该只是 0,而新值应该只是 row_numbers()。

我正在使用 Postgresql。

【问题讨论】:

    标签: sql postgresql aggregate-functions


    【解决方案1】:

    您可以使用以下方法获取select 中的值:

    select p.*,
           (coalesce(max(number) over (partition by category), 0) +
            row_number() over (partition by category order by number)
           ) as newnumber
    from person p;
    

    然后您可以将其放入 update 语句中:

    update person
        set number = pp.newnumber
        from (select p.*,
               (coalesce(max(number) over (partition by category), 0) +
                row_number() over (partition by category order by number)
               ) as newnumber
              from person p
             ) pp
        where pp.id = p.id and p.number is null;
    

    注意:如果您试图创建一个独特的价值这样做,它可能行不通。特定类别的序号可能与其他类别的数字冲突。如果这是您想要做的,请再问一个更详细的问题。

    【讨论】:

    • 哇,真快!每个类别的数字只需要唯一,而不是整体(我现在只是在尝试您的解决方案)
    • 我注意到一个我没有在我的简化问题中指定的问题。我将快速更新问题以包含“新要求”。对此感到抱歉。
    • @taranaki 。 . .那只需要一个coalesce()。实际上,正如我刚刚写的那样,这些值将从 1 而不是 0 开始。您可以输入 -1 而不是 0 以从 0 开始。
    • 嗨,戈登。不幸的是,仍然存在一个小问题:/ row_number() 太高了,因为考虑了所有行,而不仅仅是具有空值的行。所以数字不是连续的......我可以通过添加“按数字顺序排列”来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多