SQL-запрос для умножения
У меня есть два отношения (таблицы в базе данных SQL) с чисто числами. Эти два отношения можно представить как Матрицы.
Вопрос состоит в том, чтобы написать SQL-запрос, чтобы умножить там два отношения, как мы это делаем с нормальным умножением матрицы.
Я за это ломаю голову … Но бесполезно: O
Может кто-нибудь, пожалуйста, помогите мне ?????
Таблица №1:
@ Аарон Бертран:
Я использую SQL Server 2008 R2 Скриншоты таблиц:
Таблица 1 :
Таблица 2 :
Я использовал запрос:
select t1.A,t2.B,SUM(t1.C*t2.C) from Table_1 as t1 join Table_2 as t2 on t1.B=t2.A group by t1.A,t2.B order by t1.A
Ответ :
Этот способ довольно прост, а не мой оригинальный способ Matrix, предложенный @Marcelo Cantos и @ypercube …
Предполагая следующую структуру:
A (row INT, col INT, value FLOAT) B (row INT, col INT, value FLOAT)
Вы можете написать это:
SELECT A.row, B.col, SUM(A.value * B.value) FROM A JOIN B ON A.col = B.row GROUP BY A.row, B.col
EDIT: использование табличной компоновки таблицы для имитации структуры матрицы затрудняет эту проблему по крайней мере по двум причинам:
- Вы не можете разбирать строки и столбцы симметрично.
- Вы не можете портативно ссылаться на строку, из которой приходит элемент.
Лучше всего было бы добавить столбец номера строки в каждую таблицу, таким образом …
table1 (row, A, B, C) table2 (row, A, B, C)
… затем синтезирует структуру, которую я предлагаю выше, как представление для каждой таблицы …
CREATE VIEW A SELECT row, 1, A FROM table1 UNION SELECT row, 2, B FROM table1 UNION SELECT row, 3, C FROM table1 UNION -- Ditto VIEW B
… и, наконец, использовать SQL выше для оценки ответа. При необходимости вы можете написать другое представление, которое преобразует результат обратно в табличную структуру.
Честно говоря, я считаю, что все это очень ошибочно. Вы найдете, что все работает намного лучше с структурой row / col / value (и более логически когерентной), чем структура A / B / C / …. Рассмотрим, например, насколько легко вы можете вычислить транспонирование матрицы с использованием значения row / col /:
SELECT col AS row, row AS col, value FROM A
или суммировать диагональ:
SELECT SUM(value) FROM A WHERE row = col
и спросите себя, насколько легко они будут использовать вашу структуру.
PS: В отношении логической согласованности ваши таблицы не являются отношениями в собственном смысле слова, поскольку они определяют порядок в строках и должны обязательно допускать повторяющиеся строки, ни один из которых не имеет смысла в отношении, которое (свободно) определяется как набор кортежей. Это сочетание n-мерных отношений с двумерными таблицами лежит в основе многих проблем, связанных с управлением данными в наши дни.
Я полагаю, что обе таблицы имеют (i, j, dataij)
столбцы
где i
означает, что row
и j
означают column
:
SELECT ai , bj , SUM(a.dataij * b.dataij) FROM table1 AS a JOIN table2 AS b ON aj = bi GROUP BY ai , bj
С этой структурой данных операции между матрицами, такими как умножение, проще. Сложнее показать таблицы в обычном матричном формате. Один из способов – использовать что-то вроде этого (проверьте PIVOT, если у вас есть версия SQL-Server, которая поддерживает ее для других способов ее достижения):
SELECT MIN(CASE WHEN j=1 THEN dataij ELSE NULL END) AS column1 , MIN(CASE WHEN j=2 THEN dataij ELSE NULL END) AS column2 , MIN(CASE WHEN j=3 THEN dataij ELSE NULL END) AS column3 FROM tableX GROUP BY i ORDER BY i ;