Я пытаюсь сравнить две записи из 6 чисел, каждое число, которое может быть либо нулевым, либо 1 (то есть 100001 или 011101). Если 3 из 6 соответствуют, я хочу, чтобы выход был .5. Если 2 из 6 соответствуют, я хочу, чтобы выход был .33 и т.д.
Обратите внимание, что положение имеет значение. Совпадение происходит только тогда, когда обе записи имеют 1 в первой позиции, у обоих есть 0 во второй позиции и т.д.
Вот команды SQL для создания таблицы
CREATE TABLE sim
(sim_key int,
string int);
INSERT INTO sim (sim_key, string)
VALUES (1, 111000);
INSERT INTO sim (sim_key, string)
VALUES (2, 101101);
Мой желаемый результат для сравнения двух строк, которые содержат 50% символов, и вывод 50%.
Можно ли сделать подобное сравнение в SQL? Спасибо заранее
Взгляните на этот пример.
CREATE TABLE sim (sim_key int, string int);
INSERT INTO sim (sim_key, string) VALUES (1, 111000);
INSERT INTO sim (sim_key, string) VALUES (2, 101101);
select a.string A, b.string B,
sum(case when Substring(A.string,Pos,1) = Substring(B.string,Pos,1) then 1 else 0 end) Matches,
count(*) as RowCount,
(sum(case when Substring(A.string,Pos,1) = Substring(B.string,Pos,1) then 1 else 0 end) /
count(*) * 100.0) as PercentMatch
from sim A
cross join sim B
inner join (
select 1 Pos union all select 2 union all select 3
union all select 4 union all select 5 union all select 6) P
on P.Pos between 1 and length(A.string)
where A.sim_key= 1 and B.sim_key = 2
group by a.string, b.string
Он груб и, вероятно, включен больше, чем требуется, но показывает, как это можно сделать. Лучше создать таблицу numbers
с номерами от 1 до 1000 или около того, которые могут использоваться повторно во многих запросах, где требуется последовательность чисел. Такая таблица заменит виртуальную таблицу (выберите... union, используемую во внутреннем соединении)
Вместо того, чтобы сохранить 10010101 как целое, преобразуйте эту двоичную версию в истинное целое число при сравнении битовой логики И, результат преобразуется в двоичный и count '1' в число совпадений...
для конвертирования: http://dev.mysql.com/doc/refman/5.5/en/binary-varbinary.html
для сравнения: http://dev.mysql.com/doc/refman/5.5/en/bit-functions.html побитовое И
...