如何在SQL中计算点积
这类似于,但差异很大,我再次问。在我的情况下,提议的解决方案也将是不切实际的缓慢 注意:我还在红移中处理非常大的数据集 我试图计算一个统计模型的“分数”,它要求我为数据集中的每一行计算一个点积。特别是,我想在我的表“SCORE”中创建一个新列,将第一个表中每列的值乘以该列的预先指定值 例如,我有以下表格: 首字母如何在SQL中计算点积,sql,postgresql,statistics,Sql,Postgresql,Statistics,这类似于,但差异很大,我再次问。在我的情况下,提议的解决方案也将是不切实际的缓慢 注意:我还在红移中处理非常大的数据集 我试图计算一个统计模型的“分数”,它要求我为数据集中的每一行计算一个点积。特别是,我想在我的表“SCORE”中创建一个新列,将第一个表中每列的值乘以该列的预先指定值 例如,我有以下表格: 首字母 +--------+------+-------+ | NAME | COL0 | COL1 | +--------+------+-------+ | AL | 1
+--------+------+-------+
| NAME | COL0 | COL1 |
+--------+------+-------+
| AL | 1 | 4 |
| BILL | 2 | 5 |
| CATHY | 3 | 6 |
+--------+------+-------+
+--------+------+-------+-------+
| NAME | COL0 | COL1 | SCORE |
+--------+------+-------+-------+
| AL | 1 | 4 | 45 |
| BILL | 2 | 5 | 60 |
| CATHY | 3 | 6 | 75 |
+--------+------+-------+-------+
估计值
+--------+----------+
| NAME | ESTIMATE |
+--------+----------+
| COL0 | 5 |
| COL1 | 10 |
+--------+----------+
我想要最后一张桌子
决赛
+--------+------+-------+
| NAME | COL0 | COL1 |
+--------+------+-------+
| AL | 1 | 4 |
| BILL | 2 | 5 |
| CATHY | 3 | 6 |
+--------+------+-------+
+--------+------+-------+-------+
| NAME | COL0 | COL1 | SCORE |
+--------+------+-------+-------+
| AL | 1 | 4 | 45 |
| BILL | 2 | 5 | 60 |
| CATHY | 3 | 6 | 75 |
+--------+------+-------+-------+
对于最终表格,初始表格中每列的值乘以不同的数字,具体取决于估算表中列出的值
例如,AL的分数由1*5+4*10=45得出。其中5和10来自估算表
目前,我正在通过编写SQL代码来创建“分数”列,该代码手动写入估算值中的数字。您可以通过加入表,然后使用条件聚合来完成此操作:
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;
您可以通过连接表,然后使用条件聚合来实现这一点:
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;
假设在使用案例进行数据透视时,估算表将始终显示为一行
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
假设在使用案例进行数据透视时,估算表将始终显示为一行
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
您可以通过以下方式连接表来完成此操作:
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;
请将此作为参考您可以通过以下方式连接表格:
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;
请将此作为参考如果您的数据集非常大且有许多列,则无论如何操作,您都需要为“不切实际的慢”做好准备。如果您的数据集非常大且有许多列,则无论如何操作,您都需要为“不切实际的慢”做好准备。