Сравнение строк в MySQL с выводом в процентах (очень важная позиция - PullRequest
0 голосов
/ 01 февраля 2011

Я пытаюсь сравнить две записи из 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? Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

Посмотрите на этот пример.

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 или около того, которую можно многократно использовать во многих запросах, где требуется числовая последовательность. Такая таблица заменит (выберите .. объединение виртуальной таблицы, используемой во внутреннем объединении)

1 голос
/ 01 февраля 2011

Вместо того, чтобы хранить 10010101 как целое число, преобразуйте эту двоичную версию в истинное целое, когда при сравнении используйте битовую логику И, результат преобразуется в двоичный файл и подсчитывает '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 поразрядно И

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...