首页 > 试题广场 >

精品咖啡连锁门店王牌产品及其最忠实顾客分析

[编程题]精品咖啡连锁门店王牌产品及其最忠实顾客分析
  • 热度指数:757 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

一、题目描述

【背景】
某精品咖啡连锁品牌在多个城市开设门店,所有门店共享统一的订单系统。运营团队需要为每家门店找出其"王牌产品"(销售额最高的产品),以及该王牌产品的"最忠实顾客"(购买该产品数量最多的顾客)。该分析需要两步关联:先定位每家门店的王牌产品,再基于该产品进一步找出该产品的头号顾客。

【表结构与字段说明】

表1:coffee_shops(咖啡门店表)

  • shop_id:INT,门店编号,主键
  • shop_name:VARCHAR(50),门店名称
  • city:VARCHAR(20),所在城市
  • district:VARCHAR(30),所在区域

表2:order_details(订单明细表)

  • order_id:INT,订单编号,主键
  • shop_id:INT,门店编号,关联 coffee_shops.shop_id
  • customer_name:VARCHAR(30),顾客姓名
  • product_name:VARCHAR(30),商品名称
  • order_date:DATE,下单日期
  • quantity:INT,购买数量(保证 >= 1)
  • unit_price:DECIMAL(8,2),单价(元)

二、问题

请使用链式 LATERAL JOIN(两个 LATERAL 子查询串联,第二个 LATERAL 引用第一个 LATERAL 的输出结果)查询每家门店的王牌产品及该产品的最忠实顾客。

具体规则:
(1)王牌产品:对每家门店,按商品汇总销售总额(SUM(quantity * unit_price)),取销售总额最高的1个商品。若销售总额相同,取总销量(SUM(quantity))更高的;若仍相同,取 product_name 升序排列靠前的。
(2)最忠实顾客:在确定王牌产品后,对该门店购买过该王牌产品的所有顾客,按购买该产品的总数量(SUM(quantity))取最多的1位顾客,同时输出该顾客首次购买该产品的日期。若总数量相同,取首次购买日期(MIN(order_date))更早的;若仍相同,取 customer_name 升序排列靠前的。

输出以下字段:门店名称(shop_name)、所在城市(city)、王牌产品(top_product)、产品销售总额(product_revenue)、最忠实顾客(top_customer)、顾客购买数量(customer_quantity)、首次购买日期(first_purchase_date)。结果按 shop_id 升序排列。若某门店无订单记录则不出现在结果中。

三、示例数据表

coffee_shops 表:

shop_id shop_name city district
1 晨光咖啡·南京西路店 上海 静安区
2 晨光咖啡·望京店 北京 朝阳区

order_details 表:

order_id shop_id customer_name product_name order_date quantity unit_price
1 1 李明 冰美式 2025-03-01 2 22.00
2 1 李明 冰美式 2025-03-05 3 22.00
3 1 王芳 冰美式 2025-03-03 1 22.00
4 1 王芳 拿铁 2025-03-02 2 28.00
5 1 张伟 拿铁 2025-03-04 1 28.00
6 1 张伟 手冲瑰夏 2025-03-06 1 58.00
7 2 赵敏 燕麦拿铁 2025-03-01 3 32.00
8 2 赵敏 燕麦拿铁 2025-03-08 2 32.00
9 2 钱进 燕麦拿铁 2025-03-03 4 32.00
10 2 钱进 美式 2025-03-05 2 20.00
11 2 孙莉 美式 2025-03-02 3 20.00
12 2 孙莉 美式 2025-03-07 1 20.00

四、示例数据查询结果表

说明:

  • 南京西路店产品销售额汇总:冰美式=(2+3+1)×22=132.00,拿铁=(2+1)×28=84.00,手冲瑰夏=1×58=58.00。王牌产品:冰美式(132.00)。
    冰美式顾客购买量:李明=2+3=5,王芳=1。最忠实顾客:李明(5杯,首购03-01)。
  • 望京店产品销售额汇总:燕麦拿铁=(3+2+4)×32=288.00,美式=(2+3+1)×20=120.00。王牌产品:燕麦拿铁(288.00)。
    燕麦拿铁顾客购买量:赵敏=3+2=5,钱进=4。最忠实顾客:赵敏(5杯,首购03-01)。
shop_name city top_product product_revenue top_customer customer_quantity first_purchase_date
晨光咖啡·南京西路店 上海 冰美式 132.00 李明 5 2025-03-01
晨光咖啡·望京店 北京 燕麦拿铁 288.00 赵敏 5 2025-03-01


示例1

输入

CREATE TABLE coffee_shops (
    shop_id INT PRIMARY KEY,
    shop_name VARCHAR(50),
    city VARCHAR(20),
    district VARCHAR(30)
);

CREATE TABLE order_details (
    order_id INT PRIMARY KEY,
    shop_id INT,
    customer_name VARCHAR(30),
    product_name VARCHAR(30),
    order_date DATE,
    quantity INT,
    unit_price DECIMAL(8,2)
);

INSERT INTO coffee_shops VALUES
(1, '晨光咖啡·南京西路店', '上海', '静安区'),
(2, '晨光咖啡·望京店', '北京', '朝阳区');

INSERT INTO order_details VALUES
(1,  1, '李明', '冰美式',   '2025-03-01', 2, 22.00),
(2,  1, '李明', '冰美式',   '2025-03-05', 3, 22.00),
(3,  1, '王芳', '冰美式',   '2025-03-03', 1, 22.00),
(4,  1, '王芳', '拿铁',     '2025-03-02', 2, 28.00),
(5,  1, '张伟', '拿铁',     '2025-03-04', 1, 28.00),
(6,  1, '张伟', '手冲瑰夏', '2025-03-06', 1, 58.00),
(7,  2, '赵敏', '燕麦拿铁', '2025-03-01', 3, 32.00),
(8,  2, '赵敏', '燕麦拿铁', '2025-03-08', 2, 32.00),
(9,  2, '钱进', '燕麦拿铁', '2025-03-03', 4, 32.00),
(10, 2, '钱进', '美式',     '2025-03-05', 2, 20.00),
(11, 2, '孙莉', '美式',     '2025-03-02', 3, 20.00),
(12, 2, '孙莉', '美式',     '2025-03-07', 1, 20.00);

输出

shop_name|city|top_product|product_revenue|top_customer|customer_quantity|first_purchase_date
晨光咖啡·南京西路店|上海|冰美式|132.00|李明|5|2025-03-01
晨光咖啡·望京店|北京|燕麦拿铁|288.00|赵敏|5|2025-03-01
头像 牛客32368363号
发表于 2026-04-16 10:27:25
感觉lateral join使用起来没有特别便捷,大概是我还没摸到门道吧 with order_customer_agg as ( select shop_id, product_name, customer_name, sum(quantity) sum_q 展开全文
头像 bbbbbbg
发表于 2026-04-20 19:09:00
select a.shop_name, a.city, a.product_name as top_product, a.gmv as product_revenue, b.customer_name as top_customer, b.qty as 展开全文
头像 前程似锦的芝士
发表于 2026-04-22 21:36:34
select t1.shop_name, t1.city, t3.product_name as top_product, t3.product_revenue, t5.customer_name as top_customer, t5.custome 展开全文
头像 误清秋
发表于 2026-04-21 20:42:04
with lsb1 as ( select c.shop_id, shop_name, city, product_name, sum(quantity*unit_price) as product_r 展开全文
头像 cantin
发表于 2026-04-08 22:33:39
with temp0 as ( select shop_id, product_name, sum(quantity*unit_price) as total_price, sum(quantity) as total_cou 展开全文
头像 11ele
发表于 2026-04-19 18:47:52
with temp1 as ( select shop_id,shop_name,city,product_name,sum_sale as product_revenue,rank() over(partition by shop_name order by sum_sale desc,n 展开全文
头像 我的名字在哪里
发表于 2026-04-15 21:07:56
WITH a AS( SELECT cs.shop_id, shop_name, city, product_name, product_revenue FROM coffee_shops cs CROSS JOIN LATERAL( SELECT product_name, SUM(quant 展开全文
头像 重生之各大厂争着抢我
发表于 2026-04-19 22:44:00
select c.shop_name, c.city, temp1.top_product, temp1.product_revenue, temp2.top_customer, temp2.customer_quantity, temp2. 展开全文
头像 Sunshine晶晶
发表于 2026-04-20 13:29:30
WITH order_customer_agg AS ( SELECT shop_id, customer_name, product_name, SUM(quantity) AS sum_qty, SU 展开全文
头像 熊猫爱写SQL
发表于 2026-04-09 16:13:14
with t1 as ( select cs.shop_id, cs.shop_name, cs.city, o.product_name as top_product, p 展开全文