更新为每组分配序列号
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
给我一个关于无法在子查询中引用它的错误。
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
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
给我一个关于无法在子查询中引用它的错误。
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