如何在PostgreSQL中基于不同行值为Category变量创建新层级
PostgreSQL实现方案
你要的需求可以直接用PostgreSQL原生的UNION ALL结合条件聚合实现,不需要创建辅助表,逻辑如下:
- 第一部分直接返回原始表的所有原有数据,保留已有的Category分类
- 第二部分按
Date+Persona分组,单独计算每个分组下新增分类的Var_1、Var_2值,新增分类的名称可以自定义,示例里我们叫Non-App(对应All减App的计算规则) - 两部分结果合并即可得到包含新增分类的完整数据集
对应的查询代码如下:
-- 假设你的原始表名为category_data,可替换为实际表名 SELECT * FROM category_data UNION ALL -- 生成新增的Non-App分类行 SELECT Date, Persona, 'Non-App' AS Category, -- 计算Var_1:同组All分类的Var_1减去App分类的Var_1 MAX(CASE WHEN Category = 'All' THEN Var_1 END) - MAX(CASE WHEN Category = 'App' THEN Var_1 END) AS Var_1, -- 计算Var_2:规则同上 MAX(CASE WHEN Category = 'All' THEN Var_2 END) - MAX(CASE WHEN Category = 'App' THEN Var_2 END) AS Var_2 FROM category_data GROUP BY Date, Persona -- 可选:添加排序规则方便查看结果 ORDER BY Date, Persona, Category;
你提到的样例示意图如下:
如果需要把新增的分类数据持久化写入原表,只需要把上述查询的结果用INSERT INTO语句写入即可;如果不需要物理存储,也可以把上述查询封装成视图,查询视图时会自动生成新增的分类数据,无需额外维护。
内容的提问来源于stack exchange,提问作者Pedro Alonso
相关产品推荐
相关产品推荐

