订阅更新

修正产品名格式后按月统计

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

LeetCode 1543 · 数据清洗、TRIM / LOWER、按清洗后的值分组

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

面试怎么回答

按 TRIM(LOWER(product_name)) 和 DATE_FORMAT(sale_date, '%Y-%m') 分组计数并排序。分组键用清洗后的表达式;实际项目里我会把清洗规则沉淀在明细层,下游统一使用。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

销售表的产品名是手工录入的,可能有首尾空格、大小写不一致。把产品名统一成小写、去掉首尾空格,按(产品名, 年月)统计销售次数,按产品名、月份升序排列。

表结构

  • Sales:sale_id(主键)、product_name、sale_date

思路

先清洗再聚合:分组键必须是清洗后的值 TRIM(LOWER(product_name)),月份用 DATE_FORMAT 取年月。否则大小写或空格不同的同一产品会被分成多组。

参考解法

select trim(lower(product_name)) as product_name, 
        date_format(sale_date,'%Y-%m') as sale_date,
        count(*) as total 
from Sales 
group by trim(lower(product_name)), date_format(sale_date,'%Y-%m') 
order by product_name asc, sale_date asc

易错点

  • 用原始字段分组,同一产品会因为格式差异被拆成多行。
  • 数仓里这类清洗应该放在 ODS 到 DWD 的过程中统一处理,不要每个报表各写一遍。
刷题进度保存在当前浏览器