MySQL 8.0提取产品特征字符并分组求和的技术求助
MySQL 8.0 产品变体分组及特征字符提取解决方案
我正在使用MySQL 8.0,需要从产品数据中提取特征字符,将同一产品的不同变体(如口味、是否包含运费、规格等)进行分组聚合。
原始产品数据
| 产品 | 合计 |
|---|---|
| Organic Rice Snacks - Apple | 6 |
| Organic Rice Snacks - Rice | 5 |
| 62-Sam Almond Crisp Jujube - 20g | 4 |
| 62-Sam Almond Crisp Jujube - 20g (members-only) | 5 |
| [Sale] Extra Virgin Sprouted Perilla Oil Best Before 9/3 or 9/11/2021 (160ml) | 3 |
| [Sale] Extra Virgin Sprouted Perilla Oil Best Before 9/3 or 9/11/2021 (300ml) | 3.5 |
| [Steak Family Set 4] Ribeye 12 oz. x 4 (Never frozen) | 20 |
| [Steak Family Set 4] Ribeye 12 oz. x 4 (Shipping Included) | 21 |
| Ecomom Sangol Organic Rice Snacks (Pack of Three) | 6 |
| Ecomom Sangol Organic Rice Snacks - Apple | 7.5 |
期望分组结果
| 新产品名称 | 总合计 |
|---|---|
| Organic Rice Snacks | 11 |
| 62-Sam Almond Crisp Jujube | 9 |
| [Sale] Extra Virgin Sprouted Perilla Oil Best Before 9/3 or 9/11/2021 | 6.5 |
| [Steak Family Set 4] Ribeye | 41 |
| Ecomom Sangol Organic Rice Snacks | 13.5 |
尝试的SQL语句(无法适配全部数据)
Select rtrim(substring_index(substring_index(substring_index(Product, '-', 1), '(', 1), '[', 1)) as NewProduct, SUM(Total) as GTotal From myData Group By NewProduct
我曾提问过类似问题,但实际数据更为复杂,恳请帮忙解决该问题。
解决方案
针对需求,可利用MySQL 8.0支持的REGEXP_REPLACE函数,通过正则表达式匹配并移除所有变体相关后缀,提取产品核心名称后分组聚合:
SELECT TRIM(REGEXP_REPLACE(Product, '(\\s*-\\s*.*)|(\\s*\\(.*\\))|(\\s+\\d+\\s*oz\\.\\s*x\\s*\\d+)', '')) AS NewProduct, SUM(Total) AS GTotal FROM myData GROUP BY NewProduct;
正则规则说明:
\\s*-\\s*.*:匹配并移除所有以-(前后允许带空格)开头的变体后缀,如- Apple、- 20g\\s*\\(.*\\):匹配并移除所有括号及其内部内容,如(members-only)、(160ml)、(Pack of Three)\\s+\\d+\\s*oz\\.\\s*x\\s*\\d+:匹配并移除牛排产品中的规格信息12 oz. x 4
该语句可精准处理所有给出的产品场景,聚合结果与预期完全一致。若后续出现新的变体规则,只需在正则表达式中添加对应匹配模式即可。
内容的提问来源于stack exchange,提问作者beth_9
相关产品推荐
相关产品推荐

