2015-10-30 31 views
0

這是我的問題的簡化版本(我無法想出一個在現實生活中有意義的示例)。將row_number添加到最大值

假設我有一個表的人

表人


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的Numbers。

我到目前爲止的部分(不工作,更說明我想要做的,我不知道爲什麼不可能工作的)


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 

注:角落如果所有的Nu​​mbers都爲null,那麼max(Number)應該只是0,新值應該只是row_numbers()。

我正在使用Postgresql。

回答

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語句:

作爲一個說明:如果您正試圖創建一個這樣做的唯一價值,它可能無法正常工作。特定類別的序號可能與另一類別的序號衝突。如果這是你正在嘗試做的事情,那麼請提出更多細節問題。

+0

哇,那很快!這些數字只適用於每個類別,而不是整體(我現在只是在嘗試解決方案) – taranaki

+0

我注意到我沒有在我的簡化問題中指定的問題。我會很快更新問題以包含「新要求」。對於那個很抱歉。 – taranaki

+0

@taranaki。 。 。這隻需要一個'coalesce()'。實際上,正如我剛剛寫的那樣,數值將從1開始,而不是從0開始。您可以放入'-1'而不是'0'以從0開始。 –