postgresql 如何在SQL中计算点积

mwkjh3gx  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(4)|浏览(175)

这类似于this post,但又有很大的不同,所以我再次提出,所提出的解决方案在我的情况下也会非常慢。
注意:我也在红移中处理非常大的数据集。
我正在尝试计算统计模型的“分数”,这要求我计算数据集中每一行的点积。特别是,我想在表“SCORE”中创建一个新列,将第一个表中每一列的值乘以该列的预定值。
例如,我有以下表格:

姓名首字母

+--------+------+-------+
|  NAME  | COL0 | COL1  |
+--------+------+-------+
| AL     | 1    | 4     |
| BILL   | 2    | 5     |
| CATHY  | 3    | 6     |
+--------+------+-------+

估计数

+--------+----------+
|  NAME  | ESTIMATE |
+--------+----------+
| COL0   | 5        |
| COL1   | 10       |
+--------+----------+

我想要决赛桌

最终报告

+--------+------+-------+-------+
|  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来自估计值表。
目前,我正在通过编写SQL代码来创建SCORE列,该代码手动写入估计值中的数字。

qvk1mo1f

qvk1mo1f1#

您可以通过联接表然后使用条件聚合来完成此操作:

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;
lvjbypge

lvjbypge2#

假设使用大小写透视时估计表将始终生成一行...

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
0aydgbwb

0aydgbwb3#

您可以通过将表连接为以下形式来执行此操作:

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链接作为参考

imzjd6km

imzjd6km4#

对于未来的用户,可以使用postgresql实现矢量点积here

CREATE OR REPLACE FUNCTION public.dot_product(IN vector1 double precision[], IN vector2 double precision[])
    RETURNS double precision    
AS $BODY$
BEGIN
    RETURN(SELECT sum(mul) FROM (SELECT v1e*v2e as mul FROM unnest(vector1, vector2) AS t(v1e,v2e)) AS denominator);
END;
$BODY$ LANGUAGE 'plpgsql';

相关问题