Sql 将行数添加到最大值

Sql 将行数添加到最大值,sql,postgresql,aggregate-functions,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

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

假设我有一个吃饭的人


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     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
  • 按类别分组
  • 选择每个类别的最大数字值
  • 将行_编号(按类别划分)添加到该编号并设置新值(编辑:),但仅适用于之前为null的编号
  • 到目前为止我所拥有的部分(不起作用,更多地说明我想做什么,我确实知道为什么这不可能起作用)

    注意:对于一个类别的所有数字都为空的情况,最大值(数字)应仅为0,新值应仅为行数()


    我正在使用Postgresql。

    您可以使用以下方法在
    选择中获取值:

    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.0开始。不幸的是,仍然存在一个小问题:/row_number()太高,因为考虑的是所有行,而不仅仅是具有空值的行。所以这些数字不是连续的。。。我可以通过添加“订单编号说明”来解决此问题。