更新为每组分配序列号

UPDATE to assign serial numbers per group

Table users:

id name group_id column to update
1 Paul 1
2 Mike 1
3 Charlie 1
4 Elza 2

Table groups:

id name
1 coolest group
2 random group

Table users 更新后:

id name group_id column to update
1 Paul 1 3
2 Mike 1 2
3 Charlie 1 1
4 Elza 2 1

第 1 组有 3 个用户,我们按名称对他们进行排序,并为每个用户分配一个增量。 第2组有1个用户,我们只分配一个增量。

我正在尝试更新每个组的用户,根据他们的姓名顺序在特定列上增加增量。

到目前为止我试过:

UPDATE users u
SET columntoupdate = g.increment
FROM (
         SELECT ROW_NUMBER() OVER (ORDER BY name) AS increment
         FROM users u2 INNER JOIN groups g2 ON g2.id = u2.group_id
         WHERE u.group_id = g2.id
     ) g

但是 u.group_id = g2.id 给我一个关于无法在子查询中引用它的错误。

Fiddle showing the problem

UPDATE users u
SET    columntoupdate = g.increment
FROM  (
   SELECT u2.id
        , row_number() OVER (PARTITION BY u2.group_id ORDER BY u2.name) AS increment
   FROM   users u2
   ) g
WHERE u.id = g.id
-- AND u.columntoupdate IS DISTINCT FROM g.increment  -- ①
;

db<>fiddle here

根本不需要涉及 table group
您需要 PARTITION BY group_id 获取每组序列号。
并加入PK专栏

① 添加此 WHERE 子句以抑制空更新(用于重复使用)。参见:

  • How do I (or can I) SELECT DISTINCT on multiple columns?

旁白:
您知道这种数据结构不容易持续吗?名称更改,用户被添加和删除,每个组的 gap-less 个号码维护起来很昂贵 - 而且通常是不必要的。参见:

  • Serial numbers per group of rows for compound key