SQL创建视图标记用户approved/denied状态的实现方法
需求说明
- 搭建审批统计dashboard,需统计审批通过、驳回的人员总量,基于用户状态流水表创建标记视图
- 源表为用户状态流水表,包含
person_id(用户ID)、status(状态值)、status_date(状态更新时间)三个字段,现有状态枚举包含In Progress、Sent、Denied、Appealed、Approved、Administrative Denial - 标记规则:
- 用户历史状态中存在
Approved时,通过标记位置1 - 用户历史状态中存在驳回类值(
Denied、Administrative Denial)时,驳回标记位置1
- 用户历史状态中存在
- 输出要求:每个
person_id仅返回一行结果,通过approved、denied两个0/1字段展示标记结果,需覆盖如下场景:- person_id=3:两个标记位均为1
- person_id=4:仅denied为1
- person_id=1、person_id=2:两个标记位均为0
视图实现代码
核心逻辑为按用户ID分组做条件聚合,直接执行如下SQL即可创建目标视图,注意将SQL中的表名替换为你实际使用的状态流水表名:
CREATE VIEW v_person_approval_status AS SELECT person_id, MAX(CASE WHEN status = 'Approved' THEN 1 ELSE 0 END) AS approved, MAX(CASE WHEN status IN ('Denied', 'Administrative Denial') THEN 1 ELSE 0 END) AS denied FROM 你的用户状态流水表名 GROUP BY person_id;
逻辑说明
- 按
person_id分组聚合,保证每个用户仅输出一行,符合视图输出要求 - 用
MAX()函数做聚合判断:只要用户历史状态里存在1条符合条件的记录,对应标记位就返回1;不存在符合条件的记录则返回0,完全匹配"是否存在过对应状态"的判断逻辑 - 驳回类状态统一写在
IN()条件中,后续如果新增其他驳回类状态(如超时驳回、自动驳回),直接在括号内补充对应状态值即可,无需调整整体逻辑 In Progress、Sent、Appealed这类中间状态不会触发任何标记位置1,匹配person_id 1、2的输出预期- 逻辑兼容同一用户同时存在驳回、通过记录的场景(如驳回后申诉通过),匹配person_id=3两个标记位均为1的输出预期
- 仅存在驳回类记录、无通过记录的用户,仅denied位返回1,匹配person_id=4的输出预期
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

