Postgres脏年龄数据:如何用单表达式计算范围平均值(适配Superset)
解决方案
可以通过纯表达式实现,无需子查询或LATERAL JOIN,核心思路是用CASE语句区分单个年龄和年龄范围的情况,分别计算平均值:
CASE WHEN split_part("age", ' ', 1) LIKE '%-%' THEN (split_part(split_part("age", ' ', 1), '-', 1)::int + split_part(split_part("age", ' ', 1), '-', 2)::int) / 2.0 ELSE split_part("age", ' ', 1)::int::numeric END
表达式说明
- 清理数据:用
split_part("age", ' ', 1)提取核心年龄部分,自动去掉末尾的years后缀,得到纯数字或数字范围字符串。 - 判断数据类型:通过
LIKE '%-%'识别是否为年龄范围格式。 - 计算代表值:
- 若是范围格式:拆分出前后两个数字,转为整数后求和再除以2.0(用2.0保证结果为浮点型),得到范围平均值。
- 若是单个年龄:直接转为数值型返回原年龄值。
这个表达式完全适配Superset的使用场景,不会触发集合返回函数的报错,且能准确计算出每个年龄数据的代表值。
内容的提问来源于stack exchange,提问作者mapto
相关产品推荐
相关产品推荐

