SQL查询相同Reference对应3个及以上不同SerialNumber的近10天错误数据
问题核心原因
你原有SQL的问题在于GROUP BY包含了所有表字段,SerialNumber也被纳入了分组维度,因此统计的是同一SerialNumber+同一Reference下的记录条数,自然只能筛选出单个序列号在对应参考编号下重复报错3次以上的记录,和你需要的「同一Reference下有≥3个不同SerialNumber」的需求不符。
修正后的SQL方案
这里提供两种常用实现方式,均兼容主流SQL数据库(MySQL、SQL Server、PostgreSQL等),使用时将你的表名替换为实际表名即可:
方案1:使用窗口函数(写法更简洁)
SELECT InspectDate, SerialNumber, Reference, Error, PartNumber FROM ( SELECT *, COUNT(DISTINCT SerialNumber) OVER (PARTITION BY Reference) AS distinct_serial_cnt FROM 你的表名 WHERE InspectDate >= DATEADD(day, -10, GETDATE()) ) t WHERE distinct_serial_cnt >= 3 ORDER BY CAST(InspectDate AS DATETIME) DESC
逻辑说明:先筛选最近10天的所有错误记录,再给每个Reference统计对应的不同SerialNumber数量,最后过滤出数量≥3的所有关联记录即可。
方案2:使用子查询关联(兼容性更强)
SELECT t1.* FROM 你的表名 t1 INNER JOIN ( SELECT Reference FROM 你的表名 WHERE InspectDate >= DATEADD(day, -10, GETDATE()) GROUP BY Reference HAVING COUNT(DISTINCT SerialNumber) >=3 ) t2 ON t1.Reference = t2.Reference WHERE t1.InspectDate >= DATEADD(day, -10, GETDATE()) ORDER BY CAST(t1.InspectDate AS DATETIME) DESC
逻辑说明:先单独筛选出符合「最近10天、对应≥3个不同SerialNumber」要求的Reference列表,再关联原表取出这些Reference对应的所有最近10天的错误记录。
两种方案返回的结果都和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者newbieneedshelp
相关产品推荐
相关产品推荐

