这个矩阵如何在SQL中成倍增加?

时间:2015-07-25 22:29:55

标签: mysql sql matrix group-by sum

完全披露,我是SQL的菜鸟

给定两个sparce矩阵A和B,定义为:

A(row_number,column_number,value)和B(row_number,column_number,value)

我不明白这个查询如何表示两个矩阵的乘法:

SELECT A.row_number, B.column_number, SUM(A.value * B.value)
FROM A, B
WHERE A.column_number = B.row_number
GROUP BY A.row_number, B.column_number

我的困惑在于SUM语法和GROUP BY / SELECT语法

所以对于我的GROUP BY / SELECT混淆,我不明白为什么表达式

SELECT语句后需要A.row_number和B.column_number

为什么我们必须在我们已经使用SELECT和WHERE时指定?对我来说,好像我们说我们想要使用那些表达式(A.row_number和B.column_number)进行SELECT,即使我们已经从WHERE返回了一个表。 SELECT SELECT *会不会更有意义?我假设GROUP BY只是要求你输入它在SELECT语句中使用的表达式,但我不确定。

对于SUM,我只想澄清一下,SUM只使用了A.value和来自WHERE返回的任何内容的B.value是否正确?否则,您将所有A.value乘以所有B.value。

澄清这些中的任何一个都会非常有帮助。谢谢!

3 个答案:

答案 0 :(得分:3)

create table A
(   column_number int,
    row_number int,
    value int
);
create table B
(   column_number int,
    row_number int,
    value int
);

insert A (column_number,row_number,value) values (1,1,1),(1,2,2),(2,1,3),(2,2,4);
insert B (column_number,row_number,value) values (1,1,10),(1,2,20),(2,1,30),(2,2,40);

旧样式的数据(非显式)加入不带聚合或分组:

SELECT A.row_number as Ar, B.column_number as Bc,
A.value as Av,B.value as Bv,A.value*B.value as product
FROM A, B
WHERE A.column_number = B.row_number

+------+------+------+------+---------+
| Ar   | Bc   | Av   | Bv   | product |
+------+------+------+------+---------+
|    1 |    1 |    1 |   10 |      10 |
|    2 |    1 |    2 |   10 |      20 |
|    1 |    1 |    3 |   20 |      60 |
|    2 |    1 |    4 |   20 |      80 |
|    1 |    2 |    1 |   30 |      30 |
|    2 |    2 |    2 |   30 |      60 |
|    1 |    2 |    3 |   40 |     120 |
|    2 |    2 |    4 |   40 |     160 |
+------+------+------+------+---------+

如上所述,下面的内容更加清晰:

SELECT A.row_number, B.column_number,sum(A.value * B.value) as theSum
FROM A, B
WHERE A.column_number = B.row_number
GROUP BY A.row_number, B.column_number
+------------+---------------+--------+
| row_number | column_number | theSum |
+------------+---------------+--------+
|          1 |             1 |     70 |
|          1 |             2 |    150 |
|          2 |             1 |    100 |
|          2 |             2 |    220 |
+------------+---------------+--------+

答案 1 :(得分:1)

  1. SELECT之后提供表名将标识要引用的表。在两个表具有相同列名的情况下主要有用。

  2. GROUP BY将聚合数据并按每个分组值显示一条记录。也就是说,在您的情况下,您最终每行 - 列组合只有一个记录。

答案 2 :(得分:1)

根据定义,两个矩阵A(n,m)和B(m,p)的乘法产生矩阵C(n,p)。

因此乘法的SQL应返回与用于存储A和B的数据结构相同的数据结构,即三列:

  • ROW_NUMBER
  • COLUMN_NUMBER栏

,每个(行,列)组合有一个值。

这就是为什么你需要group by子句中的前两个。

WHERE子句独立于SELECT。第一个负责获得正确的记录,第二个负责获得正确的列。