具有许多列的SQL表中的点产品

时间:2013-09-11 15:57:17

标签: sql arrays product

我想将每一行乘以一个指定的行,然后对每一行(点积)求和该产品。我的SQL表是一个名称列表和相关的高维向量。该表有1个字符串+ 1000个数字列。通常有几百万行。向量/数组中的每个浮点数都在一个新列中:

+--------+------+-------+------+---+--------+
|  NAME  | COL0 | COL1  | COL2 | … | COL999 |
+--------+------+-------+------+---+--------+
| TOPAZ  | 0.73 | 0.77  | 0.15 |   | 0.55   |
| GARDEN | 0.41 | 0.57  | 0.61 |   | 0.00   |
| HAVE   | 0.40 | 0.32  | 0.23 |   | 0.52   |
+--------+------+-------+------+---+--------+

在数组数学中,这只是sum(table * row, axis=1)。它是一个大型数组,当用C语言编写并且存在于纯内存中时需要几秒钟才能执行,因此速度非常重要。但它现在变得太大而无法进入本地内存,并且数据需要存在于SQL服务器中。如何以有效的方式计算table * GARDEN,以便我可以获得GARDEN每行的点积(下面的示例输出)?

+--------+------+-------+------+---+--------+------+
|  NAME  | COL0 | COL1  | COL2 | … | COL999 | DOT  |
+--------+------+-------+------+---+--------+------+
| TOPAZ  | 0.57 | 0.24  | 0.34 |   | 0.21   | 0.46 |
| GARDEN | 0.42 | 0.43  | 0.12 |   | 0.66   | 0.48 |
| HAVE   | 0.31 | 0.37  | 0.30 |   | 0.47   | 0.40 |
+--------+------+-------+------+---+--------+------+

非常感谢!

1 个答案:

答案 0 :(得分:1)

结构是:

select t.*,
       (t.col0 * garden.col0 +
        t.col1 * garden.col1 + . . .
        t.col999 * garden.col999
       ) as DOT
from t cross join
     (select t.*
      from t
      where name = 'GARDEN'
     ) garden;

这仍然不会特别快。 C#中的“几秒钟”可能需要很长时间,除非你有并行硬件和一个可以利用它的好的SQL数据库。