我正在尝试计算每个类别的数量,并通过覆盖postgresql中的表将其合并回表。
这是我的主表(名为Titanic,包含问题中的列):
PassengerId | Group | 0001 _01 | 1 | 0002 _01
---|---|
2 | |
3 | |
3 |
你差一点就猜对了。SET中使用的值是动态的,取决于被修改的行。您所要做的就是向它添加一个WHERE子句,以确保它从视图中选择正确的值。
UPDATE "Titanic"
SET "GroupSize" = (
SELECT "GroupSize" from "GroupSize"
where "Titanic"."Group" = "GroupSize"."Group"
-- (Pedantic safety limit, just in case)
limit 1
)
要注意,这将修改每一行,为视图中没有找到的值设置NULL。让它保留groupsize;对于视图中没有匹配的行,添加另一个WHERE子句:
UPDATE "Titanic"
SET "GroupSize" = (
SELECT "GroupSize" from "GroupSize"
where "Titanic"."Group" = "GroupSize"."Group"
limit 1
)
WHERE "Group" IN (SELECT "Group" from "GroupSize");
实际上不更新主表,只是创建视图来保存组大小。这消除了在表上执行DML时令人头痛的维护问题,想象一下将一个组转移到另一个组还需要什么。如果计数仅在视图中,则不需要执行任何额外操作。您可以使用count的窗口版本获得每个组中id的计数。(见演示)
create or replace view titanic_vw as
select passengerid "Passenger Id"
, passenger_group "Group"
, count(*) over (partition by passenger_group) "Group Size"
from titanic;