如何查询在datetime之间有多少项改变了状态?

jljoyd4f  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(307)

我有一张这样的历史表

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

上表是数据示例。意思是 id1 将状态从0更改为1,然后 id2 在mod\u日期将状态从1更改为0,然后将名称更改为 name3 以及翻转 is_active 回到1。然而, id3 只是换了个名字而已 name4 我想查询有多少项更改为活动列。所以答案是

id1, 1
id2, 2
``` `id1` 将is\ U 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

8iwquhpp

8iwquhpp1#

你需要跟踪 is_active 每项的更改 id . 可以使用窗口函数和聚合:

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

db小提琴演示:

id | cnt_is_active_changes
-: | --------------------:
 1 |                     1
 2 |                     2
06odsfpq

06odsfpq2#

使用 LAG() 获取上一个状态和聚合的窗口函数:

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

请看演示。
结果:

| id  | counter |
| --- | ------- |
| 1   | 1       |
| 2   | 2       |

相关问题