公司动态
力扣-高频 SQL 50 题(基础版)-1484. 按日期分组销售产品
一、完整建表 SQLMySQL 语法CREATE TABLE Activities ( sell_date DATE, product VARCHAR(30) ); 该表没有主键(具有唯一值的列)。它可能包含重复项。 此表的每一行都包含产品名称和在市场上销售的日期。INSERT INTO Activities(sell_date, product) VALUES (2020-05-30,Headphone), (2020-06-01,Pencil), (2020-06-02,Mask), (2020-05-30,Basketball), (2020-06-01,Bible), (2020-06-02,Mask), (2020-05-30,T-Shirt);二、需求编写解决方案找出每个日期、销售的不同产品的数量及其名称。每个日期的销售产品名称应按词典序排列。返回按sell_date排序的结果表。结果表结果格式如下例所示。三、 思路与解题题目要求拆解按照sell_date分组num_sold当天去重之后产品的个数products当天去重后的产品字典升序排列用逗号拼接最终结果按sell_date升序排序。两个关键GROUP_CONCAT(字段 ORDER BY 字段 ASC SEPARATOR ,)分组之后把多行的字符串拼接成一行ORDER BY可以指定拼接时的字典顺序COUNT(DISTINCT product)分组前必须先去重同一天同一个产品重复出现只算 1 次。完整 AC 代码SELECT sell_date, COUNT(DISTINCT product) num_sold, GROUP_CONCAT(DISTINCT product ORDER BY product SEPARATOR ,) products FROM Activities GROUP BY sell_date ORDER BY sell_date;分步演示拿示例数据推演原始数据sell_dateproduct2020-05-30Headphone2020-06-01Pencil2020-06-02Mask2020-05-30Basketball2020-06-01Bible2020-06-02Mask2020-05-30T-Shirt针对2020‑05‑30去重之后产品Basketball, Headphone, T‑ShirtCOUNT(DISTINCT product)→ 3GROUP_CONCAT拼接得到Basketball,Headphone,T‑Shirt。2020‑06‑02去重之后只有Mask数量为 1。四、总结group_concat(distinct 列 order by 列 asc separator 分隔符)不加DISTINCT重复值都会拼接进去ORDER BY可以控制拼接时的排序顺序完美契合本题字典序SEPARATOR 符号默认分隔符是逗号也可以改成空格或者别的字符五、拓展面试知识点MySQL 默认GROUP_CONCAT拼接字符串长度有限制默认 1024 字符超长会被截断真实业务里超长场景需要修改系统参数8.0 版本没有别的替代方案分组拼接字符串GROUP_CONCAT是 MySQL 专属核心函数