SQL统计需求:按工位和错误类型统计零件,保留字典序最高错误
解决SQL统计难题:按工位+错误类型统计零件,同一零件仅算字典序最高错误
现有一张包含station(工位)、error(错误类型)、uniquepart_id(唯一零件ID)的表,需求是按工位和错误类型统计零件数量,但同一工位下的同一零件若存在多个错误,仅统计字典序最高的错误。
数据示例
| station | error | uniquepart_id |
|---|---|---|
| A | ERR_01 | 0001 |
| A | ERR_01 | 0001 |
| A | ERR_02 | 0002 |
| A | ERR_02 | 0002 |
| A | ERR_03 | 0001 |
| A | ERR_03 | 0002 |
| A | ERR_03 | 0003 |
| A | ERR_03 | 0004 |
| B | ERR_01 | 0005 |
| B | ERR_01 | 0006 |
| B | ERR_02 | 0007 |
| B | ERR_02 | 0008 |
| B | ERR_03 | 0009 |
| B | ERR_03 | 0010 |
| B | ERR_03 | 0011 |
| B | ERR_03 | 0012 |
原查询语句
SELECT station, error, COUNT(DISTINCT uniquepart_id) AS num_parts FROM Tablename WHERE (process_date= 'xx-xx-xxxx') GROUP BY station, error
原查询结果
| station | error | num_parts |
|---|---|---|
| A | ERR_01 | 1 |
| A | ERR_02 | 1 |
| A | ERR_03 | 4 |
| B | ERR_01 | 2 |
| B | ERR_02 | 2 |
| B | ERR_03 | 4 |
期望结果
| station | error | num_parts |
|---|---|---|
| A | ERR_03 | 4 |
| B | ERR_01 | 2 |
| B | ERR_02 | 2 |
| B | ERR_03 | 4 |
正确SQL实现方案
核心思路是先为每个工位下的每个零件确定其字典序最高的错误类型,再基于这个结果统计数量:
完整查询语句
SELECT station, max_error AS error, COUNT(uniquepart_id) AS num_parts FROM ( -- 子查询:获取每个工位下每个零件的最高错误类型 SELECT station, uniquepart_id, MAX(error) AS max_error FROM Tablename WHERE process_date = 'xx-xx-xxxx' GROUP BY station, uniquepart_id ) AS part_max_errors GROUP BY station, max_error ORDER BY station, error;
逻辑说明
- 子查询阶段:按
station和uniquepart_id分组,用MAX(error)获取每个零件在对应工位下字典序最高的错误类型,确保每个零件只关联一个最高优先级错误。 - 外层统计阶段:基于子查询结果,按
station和max_error分组统计零件数量,最终得到符合需求的统计结果。
内容的提问来源于stack exchange,提问作者Eduardo Massieu
相关产品推荐
相关产品推荐

