顺序案例陈述

时间:2016-10-21 17:56:52

标签: mysql sql

我有点卡在一个项目上,想知道你们接下来会尝试什么。我正在尝试创建SQL代码,该代码将输出以下示例表的change_value字段中的值。

id | sequence | event_type | change_value
 1 |     1    |      a     |       0
 1 |     2    |      b     |       1
 1 |     3    |      a     |       1
 1 |     4    |      b     |       1
 2 |     1    |      a     |       0
 2 |     2    |      b     |       1
 2 |     3    |      b     |       0
 2 |     4    |      b     |       0
 3 |     1    |      a     |       0
 3 |     2    |      a     |       0
 3 |     3    |      a     |       0
 3 |     4    |      a     |       0

对于每一行,该值仅为0或1.逻辑如下:

IF `id` in the current row = `id` in the previous row;
AND `sequence` in the current row > `sequence` in the previous row;
AND `event_type` in the current row <> `event_type` in the previous row;
THEN 1
ELSE 0

1 个答案:

答案 0 :(得分:0)

我会选择left join

select t.*,
       (case when tprev.event_type is null then 0
             when tprev.event_type = t.event_type then 0
             else 1
        end) as change_value
from t left join
     t tprev
     on tprev.id = t.id and
        tprev.sequence = t.sequence - 1;

只要序列号没有间隙,这就可以工作。

基本上还有另外两种方法。一种方法是获得先前结果的复杂查询(例如,相关子查询)。另一种是使用变量(另一种形式的复杂查询)。以上比这些简单。更重要的是,它可以利用(id, sequence, event_type)上的索引来提高性能。