如何仅用SQL为每条记录的列赋予权重(PostgreSQL场景)
用纯SQL查询实现PostgreSQL中基于权重的列值计算
问题描述
现有PostgreSQL中的两张表:
表tA(业务数据)
id | col_A | col_B | type 1 | 1 | 2 | A 2 | 3 | 4 | B 3 | 3 | 1 | A
表tB(权重配置)
type | col | weight A | col_A | 0.6 A | col_B | 0.4 B | col_A | 0.4 B | col_B | 0.6
需求是生成与tA行数相同的结果集,其中col_A和col_B的值为原表对应列值乘以tB中同类型下该列的权重(例如id=1的记录类型为A,col_A=10.6=0.6,col_B=20.4=0.8),预期结果如下:
id | col_A | col_B | type 1 | 0.6 | 0.8 | A 2 | 1.8 | 1.6 | B 3 | 1.2 | 0.4 | A
目前已通过SQL函数实现,想确认是否可以仅用SQL查询完成该操作?
解决方案
完全可以用纯SQL查询实现,这里提供两种高效的写法:
写法一:条件聚合(适合列固定的场景)
SELECT ta.id, ta.col_A * MAX(CASE WHEN tb.col = 'col_A' THEN tb.weight END) AS col_A, ta.col_B * MAX(CASE WHEN tb.col = 'col_B' THEN tb.weight END) AS col_B, ta.type FROM tA ta JOIN tB tb ON ta.type = tb.type GROUP BY ta.id, ta.col_A, ta.col_B, ta.type;
写法二:多表关联(逻辑更直观)
SELECT ta.id, ta.col_A * tb_a.weight AS col_A, ta.col_B * tb_b.weight AS col_B, ta.type FROM tA ta JOIN tB tb_a ON ta.type = tb_a.type AND tb_a.col = 'col_A' JOIN tB tb_b ON ta.type = tb_b.type AND tb_b.col = 'col_B';
说明
- 两种写法都通过
tA.type与tB.type关联,确保匹配到对应类型的权重配置 - 写法一利用
CASE语句在聚合时筛选出对应列的权重,再与原列值相乘 - 写法二通过两次关联
tB,分别获取col_A和col_B的权重后计算乘积
执行任意一种查询都能得到预期的结果。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

