这类似于this post,但又不同于我再问一次。在我的案例中,提议的解决方案也是不切实际的。
注意:我也在使用Redshift中非常大的数据集。
我正在尝试计算统计模型的“得分”,这要求我为数据集中的每一行计算点积。特别是,我想在我的表“SCORE”中创建一个新列,它将第一个表中每列的值乘以该列的预先指定的值。
例如,我有以下表格:
INITIAL
+--------+------+-------+
| NAME | COL0 | COL1 |
+--------+------+-------+
| AL | 1 | 4 |
| BILL | 2 | 5 |
| CATHY | 3 | 6 |
+--------+------+-------+
估计
+--------+----------+
| NAME | ESTIMATE |
+--------+----------+
| COL0 | 5 |
| COL1 | 10 |
+--------+----------+
我想要一个决赛桌,
FINAL
+--------+------+-------+-------+
| NAME | COL0 | COL1 | SCORE |
+--------+------+-------+-------+
| AL | 1 | 4 | 45 |
| BILL | 2 | 5 | 60 |
| CATHY | 3 | 6 | 75 |
+--------+------+-------+-------+
对于最终表,INITIAL表中每列的值乘以不同的数字,具体取决于ESTIMATES表中列出的值 例如,AL的SCORE派生自1 * 5 + 4 * 10 = 45.其中5和10来自估计表。
目前,我正在创建SCORE列,方法是编写SQL代码,手动写入估算中的数字。
答案 0 :(得分:2)
您可以通过连接表然后使用条件聚合来完成此操作:
select i.name,
max(i.col0) * max(case when e.name = 'col0' then estimate end) as col0,
max(i.col1) * max(case when e.name = 'col1' then estimate end) as col1,
(max(i.col0) * max(case when e.name = 'col0' then estimate end) +
max(i.col1) * max(case when e.name = 'col1' then estimate end)
) as score
from initial i cross join
estimates e
group by i.name;
答案 1 :(得分:2)
假设在使用case ...转动时估计表总是会产生一行
SELECT i.name, i.col0, i.col1, (pest.mcol0*i.col0+pest.mcol1*i.col1) as score
FROM Initial
CROSS JOIN
(select
max(case name when 'COL0' then estimate end) as mcol0,
max(case name when 'Col1' then estimate end) as mcol1
FROM estimates) Pest -- pivot Estimate
答案 2 :(得分:0)
您可以将表格连接为:
SELECT i.NAME,i.COL0,i.COL1,
(MAX(i.COL0) * MAX(CASE WHEN e.name = 'COL0' THEN estimate end) +
MAX(i.COL1) * MAX(CASE WHEN e.name = 'COL1' THEN estimate end)) AS SCORE
FROM INITIAL i CROSS JOIN ESTIMATES E GROUP BY i.NAME,i.COL0,i.COL1 ORDER BY NAME;
请参阅 SQLFiddle Link 作为参考