我在Postgres中有一个数据表,其中包含一个列age,其中包含人们的年龄.遗憾的是,该数据是脏的,因此它包括可能代表范围的字符串条目,具有以下所有格式:

21
25-30
30-35 years

Apache Superset,我用这个数据做了一个图表.我可以对该列应用函数,例如,我使用此表达式来获得范围split_part(split_part("age",' ',1),'-', 1)::int的下限.

然而,下限并不能真正代表数据.我希望当我有一个范围来得到平均值.我试过了:

avg(unnest(string_to_array(split_part("age",' ',1),'-')::int[]))

但我得到了:

aggregate function calls cannot contain set-returning function calls
LINE 1: SELECT avg(unnest(string_to_array(split_part("ageValue",' ',...
               ^
HINT:  You might be able to move the set-returning function into a LATERAL FROM item.

这款手机有fiddle款.

我已经看到了suggestions种使用SELECT或Function实现这一点的方法,但我不能在Superset X轴查询中使用它们中的任何一种.它可以只用表达式来完成吗?如果是的话-如何完成呢?

推荐答案

显然,灵丹妙药就是清理你的数据.

对于单个表达式的快速修复:

SELECT *, CASE
           WHEN age ~ ' ' THEN (split_part(age, '-', 1)::float8 + split_part(split_part(age, ' ', 1), '-', 2)::float8) / 2
           WHEN age ~ '-' THEN (split_part(age, '-', 1)::float8 + split_part(           age         , '-', 2)::float8) / 2
           ELSE age::float8
          END AS avg_age
FROM   data;

使用聚合:

SELECT id, age, avg(age_bound) AS avg_age
FROM  (
   SELECT *, unnest(string_to_array(split_part(age, ' ', 1), '-'))::float8 AS age_bound
   FROM   data
   ) sub
GROUP  BY 1, 2;

fiddle

Sql相关问答推荐

判断Pyspark生成的SQL查询

将SEMI JOIN、ANTI JOIN转换为非连接SQL

防止ActiveRecord迁移在db/structure.sql中进行巨大更改

检索上一个星期四和上一个星期三

返回UPSERT中的旧行值

在xml.Modify方法中使用子字符串和可能的替代方法

Select 列组(按同一表格中的另一列分组)Laravel 10

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

从结果SQL查询中排除空值

改进的SQL子字符串提取

VS代码无法识别SQL代码中带括号的字符串

为什么左联接结果在MS Access数据库中不匹配

如何从postgresql中的项目映射(关联数组)设置值?

如何在sparksql查询中使用日期值?

带有数组输入参数的Snowflake UDF优化

使用日期和间隔作为键加入 Athena 上的表?

SQL Server 查找存在于所有不同时期(或序列)中的条目

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

SQL查询以获取从特定可变日期看到的用户

具有关联统计信息 N+1 的 Rails 6 索引资源?