订阅更新

按日期汇总卖出的产品:GROUP_CONCAT 拼成一列

SQL 实战 123 题 · 第 115 题 简单 约 2 分钟读完

LeetCode 1485 · 字符串聚合、去重排序拼接

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

按 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。
刷题进度保存在当前浏览器