我正在尝试编写查询以跟踪表中布尔列的更改。 表格看起来像这样
ClientHistory
-------------------------------------------------------------
| id | client_id | client_name | is_active | Timestamp |
-------------------------------------------------------------
| 1 | 1 |Example Client| True | 06/15/2020|
-------------------------------------------------------------
| 2 | 1 |Client Change | True | 06/16/2020|
-------------------------------------------------------------
| 3 | 1 |Client Change | False | 06/17/2020 |
所以我想要的是is_active更改为false的第3行。然后在那之后,我希望下一行再次更改为true。
这是我尝试过的:
SELECT a.*
FROM client_history AS a
WHERE a.is_active <>
( SELECT b.is_active
FROM client_history AS b
WHERE a.client_id = b.client_id
AND a.timestamp > b.timestamp
ORDER BY b.timestamp DESC
LIMIT 1
)
因此,子查询正试图通过获取之前的最新时间戳来获取同一client_id的上一行。然后在查询中检查is_active是否不等于上一行的is_active。但这没有按计划进行。我希望当我触发活动/不活动时,它应该在此查询中交替出现,但事实并非如此。有人有提示吗?
答案 0 :(得分:4)
使用窗口功能!
select ch.*
from (select ch.*,
lag(is_active) over (partition by client_id order by timestamp) as prev_is_active
from client_history ch
) ch
where is_active <> prev_is_active;