Сравнение строк в MySQL с выводом в процентах (очень важная позиция

0

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

  • 0
    Похоже, работа для функции.
  • 0
    Я новичок в SQL, о какой функции вы говорите?
Теги:

2 ответа

2
Лучший ответ

Взгляните на этот пример.

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, используемую во внутреннем соединении)

1

Вместо того, чтобы сохранить 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 побитовое И

...

  • 0
    Я новичок в SQL, что это значит?
  • 0
    Какие функции я должен использовать, чтобы преобразовать его в двоичный файл и как бы я сравнить его?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню