如何在SQL中计算点积

时间:2014-06-27 20:31:52

标签: sql postgresql statistics

这类似于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代码,手动写入估算中的数字。

3 个答案:

答案 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 作为参考