我有点卡在一个项目上,想知道你们接下来会尝试什么。我正在尝试创建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
答案 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)
上的索引来提高性能。