postgresql Subselect Aggregate in larger query

时间:2015-01-15 00:06:53

标签: postgresql subquery aggregate-functions

我正在处理一个有人口统计信息和行动跟踪的巨大数据集。我试图获得提交动作的人的百分比,这很简单,但也试图获得适合原始SELECT的特定子组的人的平均年龄。 CASE WHEN行单独工作,并且子查询在它自己的查询中运行良好但我似乎无法将它作为子查询集成到此查询中,它在CASE WHEN语句中给出了语法错误。这是一个稍微匿名的查询版本。任何帮助都将非常感激。

SELECT
    AVG(ageagg)
FROM
    (
        SELECT
            age AS ageagg
        FROM
            agetable
        WHERE
            age>30
        AND action_taken=1) AvgAge_30Action,
    COUNT(
        CASE
            WHEN action_taken=1
            AND age> 30
            THEN 1
            ELSE 0 NULL) / COUNT(
        CASE
            WHEN age>30) AS Over_30_Action
FROM
    agetable
WHERE
    website_type=3

1 个答案:

答案 0 :(得分:0)

如果我已正确解释您的意图,您希望计算以下内容:

1)30岁以上采取特定行动的人数占30岁以上人口总数的百分比

2)采取特定行动的30岁以上人群的平均年龄

假设我的解释是正确的,此查询可能适合您:

SELECT
  100 * over_30_action / over_30_total AS percentage_of_over_30_took_action,
  average_age_of_over_30_took_action
FROM (
  SELECT
    SUM(CASE WHEN action_taken=1 THEN 1 ELSE 0 END) AS over_30_action,
    COUNT(*) AS over_30_total,
    AVG(CASE WHEN action_taken=1 THEN age ELSE NULL END)
      AS average_age_of_over_30_took_action
  FROM agetable
  WHERE website_type=3 AND age>30
) aggregated;

我创建了一个虚拟表,并使用以下数据填充它。

postgres=# select * from agetable order by website_type, action_taken, age;
 age | action_taken | website_type
-----+--------------+--------------
  33 |            1 |            1
  32 |            1 |            2
  28 |            1 |            3
  29 |            1 |            3
  32 |            1 |            3
  33 |            1 |            3
  34 |            1 |            3
  32 |            2 |            3
  32 |            3 |            3
  33 |            4 |            3
  34 |            5 |            3
  33 |            6 |            3
  34 |            7 |            3
  35 |            8 |            3
(14 rows)

在14行中,4行(此列表中的前四行)有错误的website_type或者age低于30.在剩余的10行中,您可以看到其中的3行因此,查询应确定30%的30岁以上的人采取特定行动,特定人群的平均年龄应为33岁(年龄32,33和34岁) )。我发布的查询结果:

action_taken

同样,所有这一切都取决于我对你的意图实际上是准确的解释。这当然是基于一个非常人为的数据集,但希望它足以让你走上正确的道路。