Как использовать оператор case для присвоения значения из другой строки?

0

У меня есть таблица с идентификаторами, которые НЕ различаются. Существует поле даты и название поля RISK со значениями, такими как "Нет", "Низкий", "Средний", "Высокий". Это выглядит так:

    ID  Date    Risk
    1743333 12/1/2017   Low
    1743333 12/2/2017   Low
    1743333 12/3/2017   None
    1743333 12/4/2017   None
    1743333 12/5/2017   Medium
    1743333 12/6/2017   High
    1265464 12/1/2017   High
    1265464 12/2/2017   None
    1265464 12/3/2017   None
    1265464 12/4/2017   None
    1265464 12/5/2017   High
    1265464 12/6/2017   High

Поле RISK построено другими точками данных и вычислениями в коде, который у меня отсутствует или не знаю точно, каковы критерии для него. Значение "Нет" по существу назначается, когда недостаточно информации для назначения Low, Med или High на основе критериев расчета. Я пытаюсь сделать это, когда значения в RISK = 'None', я хотел бы присвоить предыдущее значение RISK строки на основе предыдущей даты (1 день раньше) в пределах этого идентификатора. Таким образом, в любой день, если RISK - это что-то помимо "None", а затем становится "None" как прогресс дней, я хочу сохранить предыдущее последнее значение "None". Новая таблица будет выглядеть следующим образом:

ID  Date    Risk
1743333 12/1/2017   Low
1743333 12/2/2017   Low
1743333 12/3/2017   Low
1743333 12/4/2017   Low
1743333 12/5/2017   Medium
1743333 12/6/2017   High
1265464 12/1/2017   High
1265464 12/2/2017   High
1265464 12/3/2017   High
1265464 12/4/2017   High
1265464 12/5/2017   Medium
1265464 12/6/2017   High

Я не знаком с этим, но я думал об итерации через строки с переменными назначениями. Я использую MySQL и пытаюсь реализовать это в case case, поэтому я могу присвоить результат новому полю в моей существующей таблице. Возникла проблема с ссылкой или присоединением к той же таблице в MySQL. Спасибо заранее и извините за длинный пост!

Теги:
variable-assignment
case

1 ответ

0

Самосоединение с использованием разницы дат может быть достигнуто следующим образом. Однако вы заметите, что в результате все равно будет "none".

SQL Fiddle

MySQL 5.6 Настройка схемы:

CREATE TABLE Table1
    ('ID' int, 'Date' datetime, 'Risk' varchar(6))
;

INSERT INTO Table1
    ('ID', 'Date', 'Risk')
VALUES
    (1743333, '2017-12-01 00:00:00', 'Low'),
    (1743333, '2017-12-02 00:00:00', 'Low'),
    (1743333, '2017-12-03 00:00:00', 'None'),
    (1743333, '2017-12-04 00:00:00', 'None'),
    (1743333, '2017-12-05 00:00:00', 'Medium'),
    (1743333, '2017-12-06 00:00:00', 'High'),
    (1265464, '2017-12-01 00:00:00', 'High'),
    (1265464, '2017-12-02 00:00:00', 'None'),
    (1265464, '2017-12-03 00:00:00', 'None'),
    (1265464, '2017-12-04 00:00:00', 'None'),
    (1265464, '2017-12-05 00:00:00', 'High'),
    (1265464, '2017-12-06 00:00:00', 'High')
;

Запрос 1:

select
       t.*, prev.risk as prev_risk
from table1 as t
inner join table1 as prev on t.id = prev.id and t.date = prev.date + interval 1 day
where t.risk = 'none'

Результаты:

|      ID |                 Date | Risk | prev_risk |
|---------|----------------------|------|-----------|
| 1743333 | 2017-12-03T00:00:00Z | None |       Low |
| 1743333 | 2017-12-04T00:00:00Z | None |      None |
| 1265464 | 2017-12-02T00:00:00Z | None |      High |
| 1265464 | 2017-12-03T00:00:00Z | None |      None |
| 1265464 | 2017-12-04T00:00:00Z | None |      None |

Ещё вопросы

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