Postgresql 在联接中使用子查询简化聚合查询
我们有一个表,其中保存了给定(周期,志愿者)对上的总存在时间,另一个表记录了操作:我们知道在哪个存在中执行了操作。但我们不跟踪在给定操作上花费的时间。这不是一个很好的数据结构,但我不能改变它Postgresql 在联接中使用子查询简化聚合查询,postgresql,join,subquery,Postgresql,Join,Subquery,我们有一个表,其中保存了给定(周期,志愿者)对上的总存在时间,另一个表记录了操作:我们知道在哪个存在中执行了操作。但我们不跟踪在给定操作上花费的时间。这不是一个很好的数据结构,但我不能改变它 CREATE TABLE volunteer_presence (id integer, volunteer_id integer, minutes integer); CREATE TABLE logged_actions (id integer, presence_id integer, sectio
CREATE TABLE volunteer_presence (id integer, volunteer_id integer, minutes integer);
CREATE TABLE logged_actions (id integer, presence_id integer, section varchar);
我们想做的是通过假设时间在给定存在的所有动作中平均分配,来估算在给定动作上花费的时间。这不是很好,但我们很高兴至少有了它。例如,假设我们有以下数据:
INSERT INTO volunteer_presence (id, volunteer_id, minutes) values (1, 333, 400);
INSERT INTO volunteer_presence (id, volunteer_id, minutes) values (2, 444, 90);
INSERT INTO volunteer_presence (id, volunteer_id, minutes) values (3, 555, 80);
INSERT INTO logged_actions (id, presence_id, section) values (10, 1, 'Cats');
INSERT INTO logged_actions (id, presence_id, section) values (11, 1, 'Dogs');
INSERT INTO logged_actions (id, presence_id, section) values (13, 1, 'Cats');
INSERT INTO logged_actions (id, presence_id, section) values (14, 1, 'Cats');
INSERT INTO logged_actions (id, presence_id, section) values (15, 1, 'Front');
INSERT INTO logged_actions (id, presence_id, section) values (16, 2, 'Dogs');
我们预计会有以下结果:
部分
身份证
估计分钟
猫
1.
240
狗
1.
80
正面
1.
80
狗
2.
90
presence\u id
的总计数添加到每个记录中志愿者队伍
部分的每个在场id的计数
,除以之前计算的总数
每个在场id的计数
,然后乘以分钟数
SELECT
la.presence_id,
la.section,
vp.minutes * COUNT(*) / total -- 4
FROM (
SELECT
*,
COUNT(*) OVER (PARTITION BY presence_id) as total -- 1
FROM logged_actions
) la
JOIN volunteer_presence vp ON vp.id = la.presence_id -- 2
GROUP BY la.presence_id, la.section, la.total, vp.minutes -- 3
ORDER BY la.presence_id, la.section