У меня есть таблица с идентификаторами, которые НЕ различаются. Существует поле даты и название поля 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. Спасибо заранее и извините за длинный пост!
Самосоединение с использованием разницы дат может быть достигнуто следующим образом. Однако вы заметите, что в результате все равно будет "none".
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 |