如何在postgresql中合并频率计数回表?



我正在尝试计算每个类别的数量,并通过覆盖postgresql中的表将其合并回表。

这是我的主表(名为Titanic,包含问题中的列):

tbody> <<tr>0002 _010003 _010003 _02
PassengerId Group
0001 _011
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;