按日期汇总卖出的产品:GROUP_CONCAT 拼成一列
LeetCode 1485 · 字符串聚合、去重排序拼接
面试怎么回答
按 sell_date 分组,COUNT(DISTINCT product) 和 GROUP_CONCAT(DISTINCT product ORDER BY product SEPARATOR ','),再按日期排序。我会顺带提一句 GROUP_CONCAT 有默认长度上限,以及 Hive 里用 concat_ws + collect_set 实现同样的效果。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
活动表记录每天卖出的产品名(可能重复)。对每个日期输出卖出的不同产品数量,以及按字母顺序排列、用逗号连接的产品名列表。按日期排序。
表结构
- Activities:sell_date、product;没有主键,可能有重复行
思路
按日期分组,COUNT(DISTINCT product) 求产品数;产品名列表用 MySQL 的 GROUP_CONCAT,它支持在内部 DISTINCT 去重和 ORDER BY 排序。其他数据库对应的函数是 STRING_AGG(PostgreSQL)、collect_set + concat_ws(Hive)。
参考解法
select sell_date, count(distinct product) num_sold,
group_concat(distinct product order by product) products
from Activities
group by sell_date
易错点
- GROUP_CONCAT 默认最大长度是 1024 字节,内容多时会被截断,需要调大 group_concat_max_len。
- 题目要求结果按日期排序,要写 ORDER BY sell_date。