题目:
表 Activities
:
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | sell_date | date | | product | varchar | +-------------+---------+ 该表没有主键(具有唯一值的列)。它可能包含重复项。 此表的每一行都包含产品名称和在市场上销售的日期。
编写解决方案找出每个日期、销售的不同产品的数量及其名称。
每个日期的销售产品名称应按词典序排列。
返回按 sell_date
排序的结果表。
结果表结果格式如下例所示。
示例 1:
输入:
Activities
表:
+------------+-------------+
| sell_date | product |
+------------+-------------+
| 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 | num_sold | products |
+------------+----------+------------------------------+
| 2020-05-30 | 3 | Basketball,Headphone,T-shirt |
| 2020-06-01 | 2 | Bible,Pencil |
| 2020-06-02 | 1 | Mask |
+------------+----------+------------------------------+
解释:
对于2020-05-30,出售的物品是 (Headphone, Basketball, T-shirt),按词典序排列,并用逗号 ',' 分隔。
对于2020-06-01,出售的物品是 (Pencil, Bible),按词典序排列,并用逗号分隔。
对于2020-06-02,出售的物品是 (Mask),只需返回该物品名。
题目要求我们将同日期售卖的商品做成字符串集合中间使用","分隔,设计group_concat函数
其他都比较简单,下面详细讲解一下group_concat函数使用方法。
基本语法:
一个聚合函数,它能够将分组中的字符串值连接成一个单独的字符串,提供了多种选项以定制输出结果。
1. 基本语法:
GROUP_CONCAT([DISTINCT] expression
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [SEPARATOR sep_option]])
- DISTINCT:可选,用于去除重复值。
- expression:要连接的列名或表达式。
- ORDER BY:可选,用于指定排序方式。
- SEPARATOR:可选,用于指定连接字符串的分隔符,默认为逗号`,`。2. 默认分隔符:如果不指定`SEPARATOR`,则默认使用逗号`,`作为分隔符。
3. 排序:使用`ORDER BY`子句可以在连接前对值进行排序。
4. 去除重复:使用`DISTINCT`关键字可以在连接前去除重复的值。
5. 长度限制:`GROUP_CONCAT()`的结果长度受限于系统变量`group_concat_max_len`,默认值为1024字节。可以通过设置这个变量来增加长度限制。
6. NULL值处理:GROUP_CONCAT()函数会忽略NULL值。
应用到本题,在生成products列的时候,使用group_concat(distinct product order by product asc separator ',') as products
其中distinct去重,题目要求按照顺序日期来实现,分隔符使用','
完整查询:
select
sell_date,
count(distinct product) as num_sold,
group_concat(distinct product order by product asc separator ',') as products
from
Activities
group by sell_date;