修正产品名格式后按月统计
LeetCode 1543 · 数据清洗、TRIM / LOWER、按清洗后的值分组
面试怎么回答
按 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 的过程中统一处理,不要每个报表各写一遍。