如何查询在 datetime 之间有多少项目改变了状态?
How do I query how many items have changed the status between datetime?
我有这样的历史table
id, name, is_active, mod_date
1, 'name1', 0, 2020-06-09 21:00:00
1, 'name1', 1, 2020-06-09 22:00:00
2, 'name2', 1, 2020-06-09 20:00:00
2, 'name2', 0, 2020-06-09 20:10:00
2, 'name3', 1, 2020-06-09 20:20:00
3, 'name4', 0, 2020-06-09 20:00:00
上面的table就是数据的例子。这意味着 id1
将状态从 0 更改为 1 并且 id2
将状态从 1 更改为 0 在 mod_date 之后将名称更改为 name3
以及翻转is_active
变回 1。但是,id3
只是名称更改为 name4
我想查询有多少项目有变化 is_active 列。所以答案是
id1, 1
id2, 2
id1
更改 is_active 列 1 次和 ids2
两次。
这在 SQL 中甚至可能吗?我从这样的事情开始,但我不确定如何告诉 SQL 比较前一行。
select c.id, c.is_active, c.mod_date
from customer_h c
where c.mod_date between '2020-06-09' and '2020-06-10'
order by c.ad_id, c.mod_date
您想跟踪每个 id
的 is_active
值更改的次数。您可以使用 window 函数和聚合:
select id, count(*) cnt_is_active_changes
from (
select
h.*,
lag(is_active) over(partition by id order by mod_date) lag_is_active
from history h
) h
where is_active <> lag_is_active
group by id
id | cnt_is_active_changes
-: | --------------------:
1 | 1
2 | 2
使用LAG()
window函数获取之前的状态并聚合:
select id, sum(changed) counter
from (
select id,
abs(is_active - lag(is_active) over (partition by id order by mod_date)) changed
from customer_h
) t
group by id
having sum(changed) > 0
参见demo。
结果:
| id | counter |
| --- | ------- |
| 1 | 1 |
| 2 | 2 |
我有这样的历史table
id, name, is_active, mod_date
1, 'name1', 0, 2020-06-09 21:00:00
1, 'name1', 1, 2020-06-09 22:00:00
2, 'name2', 1, 2020-06-09 20:00:00
2, 'name2', 0, 2020-06-09 20:10:00
2, 'name3', 1, 2020-06-09 20:20:00
3, 'name4', 0, 2020-06-09 20:00:00
上面的table就是数据的例子。这意味着 id1
将状态从 0 更改为 1 并且 id2
将状态从 1 更改为 0 在 mod_date 之后将名称更改为 name3
以及翻转is_active
变回 1。但是,id3
只是名称更改为 name4
我想查询有多少项目有变化 is_active 列。所以答案是
id1, 1
id2, 2
id1
更改 is_active 列 1 次和 ids2
两次。
这在 SQL 中甚至可能吗?我从这样的事情开始,但我不确定如何告诉 SQL 比较前一行。
select c.id, c.is_active, c.mod_date
from customer_h c
where c.mod_date between '2020-06-09' and '2020-06-10'
order by c.ad_id, c.mod_date
您想跟踪每个 id
的 is_active
值更改的次数。您可以使用 window 函数和聚合:
select id, count(*) cnt_is_active_changes
from (
select
h.*,
lag(is_active) over(partition by id order by mod_date) lag_is_active
from history h
) h
where is_active <> lag_is_active
group by id
id | cnt_is_active_changes -: | --------------------: 1 | 1 2 | 2
使用LAG()
window函数获取之前的状态并聚合:
select id, sum(changed) counter
from (
select id,
abs(is_active - lag(is_active) over (partition by id order by mod_date)) changed
from customer_h
) t
group by id
having sum(changed) > 0
参见demo。
结果:
| id | counter |
| --- | ------- |
| 1 | 1 |
| 2 | 2 |