sql - 检查连续多次经历相同状态的记录
问题描述
我有一个状态历史表,我需要知道哪个 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 |
--------+-------------+------------+
解决方案
您只需要在以下内容中包含所需的列select
:
select idt_card, status_name, count(*)
from user_status_hist
group by id_user, status_name
having count(*) > 1;
推荐阅读
- java - 为什么 spring-boot-maven 插件在重新打包覆盖的战争文件时会添加战争本身?
- node.js - 如何使用查询生成器过滤一对多关系
- android - 无法获取提供程序 com.google.android.gms.ads.MobileAdsInitProvider: java.lang.ClassNotFoundException - 与 multidex 无关
- javascript - 如何匹配值然后为对象添加值?
- hy - 循环和转换一系列表单的宏
- javascript - 如何在不访问互联网(FCM)的情况下在本地无线网络中发送推送通知?
- google-apps-script - 谷歌应用脚本中是否有一个函数来获取所有已发送邮件的数组
- ssis - 如何编写具有多个条件的 if 语句来创建计算列
- javascript - ClipPath 隐藏原始形状 - d3 ReactJS
- grafana - 我没有看到超过 72 小时的数据