问题
我正在使用数据库中的内核进行一个项目,而我的 PostgreSQL 技能已经碰壁了。我在两个表之间加入计算叉积,即
SELECT (d1.a * d2.a + d1.b * d2.b) AS dot FROM data d1, data d2
这给了我所有向量之间的叉积。在我的表中有以下数据
a | b | c
---+---+---
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
上面的命令产生
dot
-----
2
4
6
...
如果我想计算第 2 行与其前一行和下一行之间的点积,我将如何有效地做到这一点?
尝试
我曾尝试使用窗口函数,但未能这样做,因为它们只计算聚合函数。我想将一行与其相邻行(即它的窗口)连接起来,但不计算任何聚合。这些方面的东西:
SELECT a * a + b * b + c * c
OVER(rows between 1 preceding and 1 following) as value FROM data data;
我也尝试过使用row_number() OVER()
which works。但这对于嵌套子查询来说似乎很笨拙且效率低下。
SELECT d1.a * d3.a + d1.b * d3.b + d1.c * d3.c
FROM data d1,
(SELECT * FROM
(SELECT *, row_number() OVER() as index from data) d2
WHERE d2.index >= 1 AND d2.index <=3) d3;
最后,我试图在没有运气的情况下深入挖掘LATERAL
s 。
有什么想法吗?