Сравнение строк с запросом Mysql - PullRequest
0 голосов
/ 16 января 2019

У меня есть база данных mysql, содержащая таблицу со следующими столбцами: (Day_T1, Day_T2, Day_T3, Day_T4) и уникальный идентификатор для каждой строки. они все целые числа. Я хотел бы сравнить каждую строку с предыдущими строками по порядку. И критерии сравнения, которые мне нужны, - это подсчитать значения, равные +1 предыдущей строки.

Так что, если мы сравниваем 16 и 15, так как он вырос на +1, он должен быть посчитан как 1. и мне нужно общее количество подсчетов для каждого сравнения строк.

Строки могут иметь повторяющиеся значения. Например, если вы возьмете первые две строки в приведенной ниже таблице (19,18,15,16) и (20,17,15,15), вторая строка имеет две 15-ки. Так что каждый должен быть взят один раз для подсчета. Здесь счет должен быть 2.

Пример таблицы будет выглядеть так:

ID  Day_T1  Day_T2  Day_T3  Day_T4

70  19      18      15      16
69  20      17      15      15
68  24      25      16      17
67  19      18      14      12
66  19      17      14      13
65  17      16      15      14

И ожидаемые результаты будут примерно такими:

ID  69  68  67  66  65  64  etc

70  2   0   1   2   3   etc             
69      1   2   2   2   etc             
68          0   0   2   etc   

У меня есть только базовые знания о запросах mysql. Я не совсем уверен, что MySQL является правильным способом сделать это. Если это не так, и я был бы рад, если бы вы могли направить меня в правильном направлении.

Заранее спасибо.

РЕШЕНИЕ в соотв. на ответ Cobra_Fast:

SELECT
    d1.id,
    d2.id,
    IF((d1.day1-d2.day1)=1,1,0) +
    IF((d1.day1-d2.day2)=1,1,0) +
    IF((d1.day1-d2.day3)=1,1,0) +
    IF((d1.day1-d2.day4)=1,1,0) +
    IF((d1.day2-d2.day2)=1,1,0) +
    IF((d1.day2-d2.day1)=1,1,0) +
    IF((d1.day2-d2.day3)=1,1,0) +
    IF((d1.day2-d2.day4)=1,1,0) +
    IF((d1.day3-d2.day3)=1,1,0) +
    IF((d1.day3-d2.day1)=1,1,0) +
    IF((d1.day3-d2.day2)=1,1,0) +
    IF((d1.day3-d2.day4)=1,1,0) +
    IF((d1.day4-d2.day4)=1,1,0) +
    IF((d1.day4-d2.day1)=1,1,0) +
    IF((d1.day4-d2.day2)=1,1,0) +
    IF((d1.day4-d2.day3)=1,1,0)     AS onecount
FROM days AS d1 , days AS d2
WHERE d1.id IS NOT NULL AND d2.id IS NOT NULL AND d1.id<>d2.id;

где структура таблицы выглядит так:

CREATE TABLE days (
    id INT AUTO_INCREMENT,
    day1 INT,
    day2 INT,
    day3 INT,
    day4 INT,
    PRIMARY KEY (id)
);

INSERT INTO days VALUES
    (70, 19, 18, 15, 16),
    (69, 20, 17, 15, 15),
    (68, 24, 25, 16, 17),
    (67, 19, 18, 14, 12),   
    (66, 19, 17, 14, 13),    
    (65, 17, 16, 15, 14);

1 Ответ

0 голосов
/ 16 января 2019

Вы можете сделать что-то вроде этого:

SELECT
    d1.id,
    d2.id,
    IF(ABS(d1.day1-d2.day1)=1,1,0) +
    IF(ABS(d1.day2-d2.day2)=1,1,0) +
    IF(ABS(d1.day3-d2.day3)=1,1,0) +
    IF(ABS(d1.day4-d2.day4)=1,1,0) AS onecount
FROM days AS d1
LEFT JOIN days AS d2 ON (d1.id = (d2.id + 1))
WHERE d1.id IS NOT NULL AND d2.id IS NOT NULL;

Результат выглядит так:

id  id  onecount
66  65  3
67  66  2
68  67  0
...

Fiddle: https://www.db -fiddle.com / f / 7VAG1GTgj6CXiLKkPAHJtf / 1

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