Hive 刷题——恶意取消订单用户统计
问题描述
给出了订单表数据,找出恶意退单用户(30 min 内两次取消订单用户明细)
示例数据
order_id user_id order_status operate_time 1101 a 已支付 2024-03-01 10:00:00 1102 a 已取消 2024-03-01 10:10:00 1103 a 待支付 2024-03-01 10:20:00 1104 b 已取消 2024-03-01 10:30:00 1105 a 待确认 2024-03-01 10:50:00 1106 a 已取消 2024-03-01 11:00:00 1107 b 已取消 2024-03-01 11:40:00 1108 b 已取消 2024-03-01 11:50:00 1109 b 已支付 2024-03-01 12:00:00 1110 b 已取消 2024-03-01 12:11:00 1111 c 已取消 2024-03-01 12:20:00 1112 c 已取消 2024-03-01 12:30:00 1113 c 已取消 2024-03-01 12:55:00 1114 c 已取消 2024-03-01 13:00:00
参考实现
with temp as (select 1101 as order_id, 'a' as user_id, "已支付" as order_status, "2023-01-01 10:00:00" as operate_time union all select 1102 as order_id, 'a' as user_id, "已取消" as order_status, "2023-01-01 10:10:00" as operate_time union all select 1103 as order_id, 'a' as user_id, "待支付" as order_status, "2023-01-01 10:20:00" as operate_time union all select 1104 as order_id, 'b' as user_id, "已取消" as order_status, "2023-01-01 10:30:00" as operate_time union all select 1105 as order_id, 'a' as user_id, "待确认" as order_status, "2023-01-01 10:50:00" as operate_time union all select 1106 as order_id, 'a' as user_id, "已取消" as order_status, "2023-01-01 11:00:00" as operate_time union all select 1107 as order_id, 'b' as user_id, "已取消" as order_status, "2023-01-01 11:40:00" as operate_time union all select 1108 as order_id, 'b' as user_id, "已取消" as order_status, "2023-01-01 11:50:00" as operate_time union all select 1109 as order_id, 'b' as user_id, "已支付" as order_status, "2023-01-01 12:00:00" as operate_time union all select 1110 as order_id, 'b' as user_id, "已取消" as order_status, "2023-01-01 12:11:00" as operate_time union all select 1111 as order_id, 'c' as user_id, "已取消" as order_status, "2023-01-01 12:20:00" as operate_time union all select 1112 as order_id, 'c' as user_id, "已取消" as order_status, "2023-01-01 12:30:00" as operate_time union all select 1113 as order_id, 'c' as user_id, "已取消" as order_status, "2023-01-01 12:55:00" as operate_time union all select 1114 as order_id, 'c' as user_id, "已取消" as order_status, "2023-01-01 13:00:00" as operate_time) select user_id from (select user_id, sum(1) over (partition by user_id order by unix_timestamp(operate_time) range between 1800 preceding and current row ) cnt from temp where order_status = '已取消') t where cnt >= 2 group by user_id;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
2023-03-26 一维数组的使用(二)