Bootstrap

[高频sql50ti]第1484题,按日期分组销售产品

题目:

表 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;

;