No testdata at current.
使用窗口函数、前缀分组和分组聚合算法。
首先按照商品 ID 分组,并按照价格日期升序排列,使用 LAG 函数获取当前记录的上一条价格和上一条价格日期。
若当前价格低于上一条价格,说明发生了一次降价;若当前价格大于或等于上一条价格,则连续降价被打断。价格相等也不属于降价,因此同样需要划分新的区间。
某电商平台需要监控商品价格异动,当某商品连续降价达到 3 次及以上触发预警,运营将评估是否为异常促销或价格战行为。已知系统有全量商品信息表和商品价格表(记录商品的初始价格以及后续每次调整时的价格,每个商品每个调价日期仅一条记录),调整价格跟上一次价格可能相等。请找出连续降价 3 次及以上的商品,输出其各连续降价区间的起止日期、降价次数及总降价金额。
表名:goods_info — 商品信息表(全量商品),包含字段:商品 ID、商品名称
表名:goods_price — 商品价格表,包含字段:商品 ID、价格日期、售价
表的字段类型和约束请参考示例中的建表语句。
每个连续降价区间输出一行,包括商品 ID、商品名称、降价起始日、降价结束日、降价次数、总降价金额。总降价金额为降价起始日售价减去降价结束日售价。同一商品的多个连续降价区间分别输出。按降价次数从高到低排序,次数相同的按商品 ID 升序排列。降价起始日和降价结束日的具体含义请参考示例的输出及说明。
输入
DROP TABLE IF EXISTS goods_price;
DROP TABLE IF EXISTS goods_info;
CREATE TABLE goods_info (
goods_id VARCHAR(20) PRIMARY KEY,
goods_name VARCHAR(50)
);
CREATE TABLE goods_price (
goods_id VARCHAR(20),
price_date DATE,
price DECIMAL(10,2),
UNIQUE KEY uk_goods_date (goods_id, price_date)
);
INSERT INTO goods_info VALUES
('G001','商品A'),
('G002','商品B'),
('G003','商品C');
INSERT INTO goods_price VALUES
('G001','2026-07-01',100.00),
('G001','2026-07-03',95.00),
('G001','2026-07-06',90.00),
('G001','2026-07-10',85.00),
('G002','2026-07-01',200.00),
('G002','2026-07-04',190.00),
('G002','2026-07-07',180.00),
('G002','2026-07-11',170.00),
('G002','2026-07-14',175.00),
('G003','2026-07-01',50.00),
('G003','2026-07-03',48.00),
('G003','2026-07-06',45.00);
输出
goods_id|goods_name|drop_start_date|drop_end_date|drop_times|total_drop_amount
G001|商品A|2026-07-01|2026-07-10|3|15.00
G002|商品B|2026-07-01|2026-07-11|3|30.00
说明
场景1: 商品A — 7月1日售价100元为降价起始日(基准日);7月3日降至95元(低于上一次记录的100元),第1次降价;7月6日降至90元(低于上一次记录的95元),第2次降价;7月10日降至85元(低于上一次记录的90元),第3次降价,连续降价3次达到门槛。降价区间为7月1日至7月10日,总降幅=降价起始日售价100元 - 降价结束日售价85元 = 15元
场景2: 商品B — 7月1日售价200元为降价起始日(基准日);7月4日降至190元(低于上一次记录的200元),第1次降价;7月7日降至180元(低于上一次记录的190元),第2次降价;7月11日降至170元(低于上一次记录的180元),第3次降价,连续降价3次达到门槛;7月14日涨至175元(高于上一次记录的170元),涨价打断连续降价,区间结束。降价区间为7月1日至7月11日,总降幅=200元 - 170元 = 30元
场景3: 商品C — 7月1日售价50元为降价起始日(基准日);7月3日降至48元,第1次降价;7月6日降至45元,第2次降价,仅连续降价2次,不满3次门槛,不输出
最终输出: 商品A和商品B的降价次数均为3次,次数相同,按商品ID升序排列,商品A在前
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册