将row_number添加到最大值

时间:2015-10-30 11:43:25

标签: sql postgresql aggregate-functions

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

假设我有一个表人

表人


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(按类别分区)添加到该数字并设置新值,(edit :)但仅适用于之前为null的Numbers。
  4. 到目前为止我所拥有的部分(不工作,更多是为了说明我想做什么,我知道为什么这不可行)

    
    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
    

    注意:对于类别中所有Numbers为空的极端情况,max(Number)应该只是0,新值应该只是row_numbers()。

    我正在使用Postgresql。

1 个答案:

答案 0 :(得分: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;

作为注释:如果您尝试创建一个独特的值,它可能无法正常工作。特定类别的序号可能与另一类别的数字冲突。如果这是您要做的事情,那么请提出更多详细信息。