这是我的问题的简化版本(我无法提出一个在现实生活中有意义的示例)。
假设我有一个餐桌人
表人
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
到目前为止,我所拥有的部分(不工作,更多地说明我想做的事情,我知道为什么这可能行不通)
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为null的特殊情况,max(Number)应该只是0,而新值应该只是row_numbers()。
我正在使用Postgresql。
您可以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;
注意:如果您尝试创建一个唯一值,则可能不起作用。特定类别的序号可能与另一类别的序号冲突。如果这是您要尝试执行的操作,请询问另一个具有更多详细信息的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句