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_type
或 age
低于 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)
再次声明,所有这些都是基于我对您意图的准确解释。这当然是基于一个高度人为设计的数据集,但希望它足以成为一个功能性的路标,让您走上正确的道路。
我正在处理一个巨大的个人数据集,其中包含人口统计信息和行为跟踪。我正在尝试获取执行某项操作的人的百分比,这很简单,但也试图获取适合原始 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_type
或 age
低于 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)
再次声明,所有这些都是基于我对您意图的准确解释。这当然是基于一个高度人为设计的数据集,但希望它足以成为一个功能性的路标,让您走上正确的道路。