回答更新的问题
SELECt *FROM ( SELECt * ,lag(val, 1, 0) OVER (PARTITION BY status ORDER BY id) last_val ,lag(status) OVER (PARTITION BY val ORDER BY id) last_status FROM t1 ) xWHERe status = 1AND (last_val <> val OR last_status = 0)
如何?
与以前相同,但是这次结合了两个窗口功能。打开设备是否符合以下条件:
1.最后打开的设备是否与其他设备 不同 。
2.或同一设备的最后一个条目已 关闭 。
NULL分区的第一行与的大写字母无关紧要,因为那么该行已经在 1中 限定了 。
回答问题的原始版本。
如果您正确地理解了您的任务,则可以通过以下简单查询完成任务:
SELECt *FROM ( SELECt * ,lag(val, 1, 0) OVER (ORDER BY id) last_on FROM t1 WHERe status = 1 ) xWHERe last_on <> val
根据要求返回第1、3、6、7行。
如何?
根据您的描述,子查询将忽略所有关闭操作,因为这仅仅是噪音。将条目保留在打开设备的位置。其中,只有那些条目已被取消资格,而同一设备已经处于打开状态(最后一个条目处于打开状态)。为此使用窗口功能
lag()。特别是,我
0默认提供第一行的特殊情况-假设没有带的设备
val = 0。
如果有,请选择另一个不可能的数字。
如果没有数字是不可能的,则保留和一样的特殊情况
NULL,
lag(val) OVER ...并在外部查询中检查与:
WHERe last_on IS DISTINCT FROM val



