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;
相关推荐
养生技术人1 天前
Oracle OCP认证考试题目详解082系列第57题
运维·数据库·sql·oracle·开闭原则
不良人天码星1 天前
redis-zset数据类型的常见指令(sorted set)
数据库·redis·缓存
心灵宝贝1 天前
libopenssl-1_0_0-devel-1.0.2p RPM 包安装教程(openSUSE/SLES x86_64)
linux·服务器·数据库
程序新视界1 天前
MySQL中,IS NULL和IS NOT NULL不会走索引?错!
数据库·mysql·dba
wdfk_prog1 天前
闹钟定时器(Alarm Timer)初始化:构建可挂起的定时器基础框架
java·linux·数据库
许长安1 天前
Redis(二)——Redis协议与异步方式
数据库·redis·junit
java_python源码1 天前
python高校心理健康服务小程序(源码+文档+调试+基础修改+答疑)
数据库·sqlite
简色1 天前
题库批量(文件)导入的全链路优化实践
java·数据库·mysql·mybatis·java-rabbitmq
点灯小铭1 天前
基于单片机的自动存包柜设计
数据库·单片机·mongodb·毕业设计·课程设计
失散131 天前
软件设计师——09 数据库技术基础
数据库·软考·软件设计师