首页 > 解决方案 > 检查连续多次经历相同状态的记录

问题描述

我有一个状态历史表,我需要知道哪个 id_user 按顺序通过相同的状态。

表结构

create table user (
    id_user number,
    user_name number,
    status_name char(1),
    created_at timestamp,
    primary key (id_user)
);

create table user_status_hist (
    id_user_status_hist number,
    id_user number,
    status_name char(1),
    updated_at timestamp,
    primary key (id_user),
    constraint fk foreign key (id_user) references user(id_user)
);

想象一下,在下面的示例中,对于用户 123,状态 B 已连续通过 2 次。如何在我的表中找到所有此类情况?

select id_user, status_name, updated_at
from user_status_history
where id_user = 123;

--------+-------------+------------+
id_user | status_name | updated_at |
--------+-------------+------------+
    123 |           A | 2020-11-01 |
--------+-------------+------------+
    123 |           B | 2020-11-02 |
--------+-------------+------------+
    123 |           B | 2020-11-05 |
--------+-------------+------------+

通过这个查询,我发现我有一个用户多次传递相同状态的情况,但考虑到 updated_at 列,我看不出是否是连续的。

select count(*), idt_card
from user_status_hist
group by id_user, status_name
having count(*) > 1;

我怎样才能得到下面这样的输出?(“计数”列将是他依次经历这些状态的次数)

--------+-------------+------------+
id_user | status_name | count      |
--------+-------------+------------+
    123 |           A |          3 |
--------+-------------+------------+
    456 |           B |          2 |
--------+-------------+------------+
    789 |           B |          6 |
--------+-------------+------------+

标签: sqloracleoracle12c

解决方案


您只需要在以下内容中包含所需的列select

select idt_card, status_name, count(*)
from user_status_hist
group by id_user, status_name
having count(*) > 1;

推荐阅读