SQL Возвращает 1,0 в новой переменной на основе случая, когда оператор ссылается на несколько других переменных - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь создать новую переменную, которая заполняется значениями 1 (true), 0 (false) в MySQL на основе ряда дат и уровней релейной логики (null-E).

См. Скрипку: http://sqlfiddle.com/#!9/9975e1

Где record_dates и ladder_levels не обязательно в последовательном порядке. Я хотел бы вернуть поле ladder_change через случай, когда (?), Что-то вроде:

  • Во-первых, смотрите только в пределах соответствующих идентификаторов (то есть только для идентификатора 324)
    • Тогда что-то вроде: case when record_date2 > record_date1 AND (ladder_level2 < ladder_level1 OR ladder_level2>ladder_level1) then 1, else 0

Какие-нибудь советы о том, как этого добиться?

1 Ответ

0 голосов
/ 05 ноября 2018
  • Поскольку первичный ключ не определен, я предполагаю, что данные вводятся в последовательном порядке на creation_date и ladder_level. Помните , что данные хранятся в MySQL неупорядоченным образом.
  • Во-первых, мы должны использовать запрос дополнительного выбора, чтобы получить данные в требуемом порядке (как было выделено на предыдущем шаге). Примечательно, что Order By выполняется после предложения Select; поэтому нам нужно сначала отсортировать данные, а затем использовать набор результатов в качестве производной таблицы .
  • Теперь мы воспользуемся помощью Пользовательские переменные (постоянные и доступные на уровне сеанса). В другой производной таблице user_init_vars мы их инициализируем.
  • В предложении Select мы сравниваем значение текущей строки со значением предыдущей строки. После сравнения мы устанавливаем значение переменной в текущее значение строки. Вы можете думать об этом как о технике зацикливания, которую мы используем в других языках программирования, таких как PHP, C ++, Java и т. Д.
  • Case .. When выражения используются для сравнения и определения значения ladder_change.

Запрос № 1

SELECT 
  dt.ID, 
  CASE WHEN DATE(@rd) <> DATE(dt.record_date) AND 
            dt.ladder_level > @ll 
       THEN 1 
       ELSE 0 
  END AS ladder_change, 
  @rd := dt.record_date AS record_date, 
  @ll := dt.ladder_level AS ladder_level 
FROM (SELECT ID, record_date, ladder_level 
      FROM conv_example 
      ORDER BY ID, record_date, ladder_level) AS dt 
CROSS JOIN (SELECT @rd := '', 
                   @ll := '') AS user_init_vars;

| ID    | ladder_change | record_date         | ladder_level |
| ----- | ------------- | ------------------- | ------------ |
| 324   | 0             | 2016-09-15 00:00:00 | a            |
| 324   | 0             | 2016-09-15 00:00:00 | b            |
| 324   | 0             | 2017-04-07 00:00:00 | b            |
| 324   | 0             | 2017-04-07 00:00:00 | c1           |
| 324   | 0             | 2018-09-08 00:00:00 | c1           |
| 324   | 0             | 2018-09-08 00:00:00 | e            |
| 1234  | 0             | 2013-04-03 00:00:00 |              |
| 1234  | 0             | 2014-07-03 00:00:00 | a            |
| 1234  | 1             | 2015-04-01 00:00:00 | b            |
| 1234  | 1             | 2016-09-15 00:00:00 | d            |
| 1234  | 0             | 2017-02-04 00:00:00 | b            |
| 1234  | 0             | 2017-04-03 00:00:00 | b            |
| 1234  | 1             | 2017-04-07 00:00:00 | c1           |
| 1234  | 1             | 2018-09-08 00:00:00 | e            |
| 31431 | 0             | 2013-04-03 00:00:00 |              |
| 31431 | 0             | 2014-07-03 00:00:00 | a            |
| 31431 | 1             | 2017-04-07 00:00:00 | c1           |
| 31431 | 1             | 2018-09-08 00:00:00 | e            |

Просмотр на БД Fiddle

...