postgresql Subselect Aggregate in larger query

postgresql Subselect Aggregate in larger query

我正在处理一个巨大的个人数据集,其中包含人口统计信息和行为跟踪。我正在尝试获取执行某项操作的人的百分比,这很简单,但也试图获取适合原始 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) 采取特定行动的 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;

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

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_typeage 低于 30。在剩下的十行中,您可以看到 3他们中的 action_taken 为 1。因此,查询应该确定 30% 的 30 岁以上的人采取了特定的行动,并且该特定人群的平均年龄应该是 33(年龄 32、33、和 34).我发布的查询结果:

 percentage_of_over_30_took_action | average_age_of_over_30_took_action 
-----------------------------------+------------------------------------
                                30 |                33.0000000000000000
(1 row)

再次声明,所有这些都是基于我对您意图的准确解释。这当然是基于一个高度人为设计的数据集,但希望它足以成为一个功能性的路标,让您走上正确的道路。