SQL面试题练习 —— 连续支付订单合并

目录

  • [1 题目](#1 题目)
  • [2 建表语句](#2 建表语句)
  • [3 题解](#3 题解)

1 题目

现有一张用户支付表:t_user_pay 包含字段订单ID用户ID商户ID支付时间支付金额

如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。

样例数据如下:

复制代码
+----------+---------+-------------+---------------------+--------------+
| order_id | user_id | merchant_id |      pay_time        |  pay_amount  |
+----------+---------+-------------+---------------------+--------------+
| 001      | user_01 | merchant_01 | 2023-03-01 12:30:00 | 50.0         |
| 002      | user_01 | merchant_01 | 2023-03-01 13:45:00 | 75.5         |
| 003      | user_01 | merchant_02 | 2023-03-01 14:00:00 | 100.0        |
| 004      | user_01 | merchant_03 | 2023-03-02 09:15:00 | 25.0         |
| 005      | user_01 | merchant_03 | 2023-03-02 10:30:00 | 150.25       |
| 006      | user_01 | merchant_01 | 2023-03-02 11:00:00 | 500.0        |
| 007      | user_01 | merchant_02 | 2023-03-03 08:00:00 | 80.0         |
| 008      | user_02 | merchant_01 | 2023-03-03 09:30:00 | 120.0        |
| 009      | user_02 | merchant_02 | 2023-03-04 13:45:00 | 65.0         |
| 010      | user_02 | merchant_03 | 2023-03-04 14:00:00 | 150.0        |
| 011      | user_02 | merchant_03 | 2023-03-05 11:30:00 | 20.0         |
| 012      | user_02 | merchant_03 | 2023-03-05 12:00:00 | 105.0        |
| 013      | user_03 | merchant_02 | 2023-03-05 13:15:00 | 250.0        |
| 014      | user_03 | merchant_01 | 2023-03-06 09:45:00 | 30.0         |
| 015      | user_03 | merchant_02 | 2023-03-06 10:00:00 | 90.5         |
+----------+---------+-------------+---------------------+--------------+

2 建表语句

sql 复制代码
CREATE TABLE t_user_pay (
  order_id VARCHAR(255),       -- 订单ID
  user_id VARCHAR(255),        -- 用户ID
  merchant_id VARCHAR(255),    -- 商户ID
  pay_time TIMESTAMP,          -- 支付时间
  pay_amount DOUBLE            -- 支付金额
);

INSERT INTO t_user_pay VALUES
  ('001', 'user_01', 'merchant_01', '2023-03-01 12:30:00', 50.0),
  ('002', 'user_01', 'merchant_01', '2023-03-01 13:45:00', 75.5),
  ('003', 'user_01', 'merchant_02', '2023-03-01 14:00:00', 100.0),
  ('004', 'user_01', 'merchant_03', '2023-03-02 09:15:00', 25.0),
  ('005', 'user_01', 'merchant_03', '2023-03-02 10:30:00', 150.25),
  ('006', 'user_01', 'merchant_01', '2023-03-02 11:00:00', 500.0),
  ('007', 'user_01', 'merchant_02', '2023-03-03 08:00:00', 80.0),
  ('008', 'user_02', 'merchant_01', '2023-03-03 09:30:00', 120.0),
  ('009', 'user_02', 'merchant_02', '2023-03-04 13:45:00', 65.0),
  ('010', 'user_02', 'merchant_03', '2023-03-04 14:00:00', 150.0),
  ('011', 'user_02', 'merchant_03', '2023-03-05 11:30:00', 20.0),
  ('012', 'user_02', 'merchant_03', '2023-03-05 12:00:00', 105.0),
  ('013', 'user_03', 'merchant_02', '2023-03-05 13:15:00', 250.0),
  ('014', 'user_03', 'merchant_01', '2023-03-06 09:45:00', 30.0),
  ('015', 'user_03', 'merchant_02', '2023-03-06 10:00:00', 90.5);

样例结果

3 题解

sql 复制代码
select
    user_id,
    merchant_id,
    min(pay_time) new_pay_time,
    sum(pay_amount) new_pay_amount
from
(select
		*,
	# 分别按照用户分组按照支付时间进行排序得到 u_rn,
	# 用户和商户分组按照支付时间排序u_m_rn
    row_number()over(partition by user_id order by pay_time) as u_rn,
    row_number()over(partition by user_id,merchant_id order by pay_time) as u_m_rn
from t_user_pay)t
group by user_id,merchant_id,u_rn-u_m_rn;
相关推荐
shuair13 分钟前
redis红锁Redlock
数据库·redis·bootstrap
小新同学^O^13 分钟前
简单学习 --> 限流和熔断
数据库·python·学习
专注API从业者13 分钟前
用 Open Claw + 淘宝商品接口,快速实现电商商品监控与智能选品(附完整代码)
大数据·前端·数据结构·数据库
TDengine (老段)24 分钟前
TDengine 虚拟表实现原理
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
吃好睡好便好28 分钟前
用if…elseif…end语句输出成绩等级
开发语言·前端·javascript·数据库·学习·matlab·信息可视化
努力努力再努力wz29 分钟前
【Redis入门系列】:Redis 内部编码机制与 String 深度解析:SDS 底层实现、三种编码与核心命令详解
c语言·开发语言·数据结构·数据库·c++·redis·缓存
罗超驿32 分钟前
21.jdbc 学习笔记:从原理到实践的全流程梳理
java·数据库·mysql·面试
楠枬34 分钟前
Redis 分布式锁
数据库·redis·分布式
尚雷558037 分钟前
Oracle 18C 物理 DataGuard 搭建部署完整文档(适合开发测试)
数据库·oracle·dataguard
金仓数据库1 小时前
性能提升超十倍!金仓时序数据库首入北京轨交TCC
数据库·时序数据库