如何使用case语句从另一行分配值?

时间:2017-12-15 00:34:42

标签: mysql case variable-assignment

我有一张ID不明显的表格。有一个日期字段和一个字段标题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字段由其他数据点和我没有的代码中的计算构建,或者确切地知道它的标准是什么。当没有足够的信息根据计算标准分配低,中或高时,基本上分配“无”值。我想要做的是,当RISK中的值为“无”时,我想根据该特定ID中的前一个日期(前一天)分配前一行的RISK值。因此,在任何一天,如果风险是“无”之外的任何事情,然后随着日期的进展变为“无”,我想保持之前的最新非“无”值。新表最终看起来像这样:

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语句,因此我可以将结果分配给现有表中的新字段。在引用或加入MySQL中的同一个表时遇到了问题。在此先感谢,并为这篇漫长的帖子感到抱歉!

1 个答案:

答案 0 :(得分:0)

使用日期差异的自联接可以如下实现。但是你会注意到没有'没有'仍会出现在结果中。

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'

<强> Results

|      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 |