Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在联接中使用子查询简化聚合查询_Postgresql_Join_Subquery - Fatal编程技术网

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