SQL查询字段出现次数且过滤重复数据,该如何解决
SQL查询字段出现次数且过滤重复数据
已知表T1 结构如下其中ID为自增主键
ID(Int),BarCode(varchar),TestTime(datatime),TestResult(varchar)
1, 111, 2015-03-13 13:30:30 , F
2, 111, 2015-03-13 13:20:20 , F
3, 222, 2015-03-13 13:40:33 , F
4, 111, 2015-03-15 09:00:00 , F
5, 222, 2015-03-13 13:40:33 , F
6, 222, 2015-03-13 13:40:33 , F
查询BarCode出现次数大于2且TestResult=F的记录BarCode信息
表中可以发现 ID为3, 5 ,6记录为重复记实录视为一条记录
要求输出显示
1, 111
------解决思路----------------------
要求输出显示
1, 111
这边的前面的这个1是什么意思呢,是最小的那个id,还是行号这样的1 2 3 呢
------解决思路----------------------
用 distinct 去除重复 ,然后在去重复后的临时表里边加上 分组汇总判断,数量>1的取出值就可以了
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
相同的BarCode,有三个时间,你是要取哪个呢
最大的那个,还是三个都要显示?
------解决思路----------------------
另外,你也起得早,同是早起的人,共勉~~
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
没太明白,要不结合顶楼的数据,说下想要的效果
------解决思路----------------------
因为,你这是需要聚合后的需求,聚合后,多一个列和少一列上的SQL聚合出来的结果是不一样的
你的表的数据需要用到哪些列,理一下你要得到什么样的结果,如果你理清楚后,我可以帮你定位出来
另外你的SQL版本是多少呢?
------解决思路----------------------
------解决思路----------------------
------解决思路----------------------
已知表T1 结构如下其中ID为自增主键
ID(Int),BarCode(varchar),TestTime(datatime),TestResult(varchar)
1, 111, 2015-03-13 13:30:30 , F
2, 111, 2015-03-13 13:20:20 , F
3, 222, 2015-03-13 13:40:33 , F
4, 111, 2015-03-15 09:00:00 , F
5, 222, 2015-03-13 13:40:33 , F
6, 222, 2015-03-13 13:40:33 , F
查询BarCode出现次数大于2且TestResult=F的记录BarCode信息
表中可以发现 ID为3, 5 ,6记录为重复记实录视为一条记录
要求输出显示
1, 111
------解决思路----------------------
要求输出显示
1, 111
这边的前面的这个1是什么意思呢,是最小的那个id,还是行号这样的1 2 3 呢
------解决思路----------------------
用 distinct 去除重复 ,然后在去重复后的临时表里边加上 分组汇总判断,数量>1的取出值就可以了
------解决思路----------------------
SELECT BarCode类似这样,即可
FROM(SELECT BarCode,TestTime,TestResult FROM T1 GROUP BY BarCode,TestTime,TestResult)T
GROUP BY BarCode
HAVING COUNT(1)>2
------解决思路----------------------
SELECT BarCode,COUNT(1)
FROM(SELECT BarCode,TestTime,TestResult FROM T1 GROUP BY BarCode,TestTime,TestResult)T
GROUP BY BarCode
HAVING COUNT(1)>2
------解决思路----------------------
相同的BarCode,有三个时间,你是要取哪个呢
最大的那个,还是三个都要显示?
------解决思路----------------------
SELECT BarCode,MAX(TestTime),Count(*) as cut这样即可,加个时间的聚合
FROM(SELECT BarCode,TestTime,TestResult FROM T1 GROUP BY BarCode,TestTime,TestResult)T
GROUP BY BarCode
HAVING COUNT(1)>2
另外,你也起得早,同是早起的人,共勉~~
------解决思路----------------------
select T1.BarCode,T1.TestTime,T2.Times
from T1,(select BarCode,MAX(TestTime) TestTime,Count(1) Times from T1 where TestResult='F' GROUP BY BarCode Having COUNT(1)>2) T2
where T1.BarCode=T2.BarCode and T1.TestTime=T2.TestTime
------解决思路----------------------
select T1.ID,T1.BarCode,T1.TestTime,T2.Times
from T1,(select BarCode,MAX(TestTime) TestTime,Count(1) Times from T1 where TestResult='F' GROUP BY BarCode Having COUNT(1)>2) T2
where T1.BarCode=T2.BarCode and T1.TestTime=T2.TestTime
------解决思路----------------------
没太明白,要不结合顶楼的数据,说下想要的效果
------解决思路----------------------
因为,你这是需要聚合后的需求,聚合后,多一个列和少一列上的SQL聚合出来的结果是不一样的
你的表的数据需要用到哪些列,理一下你要得到什么样的结果,如果你理清楚后,我可以帮你定位出来
另外你的SQL版本是多少呢?
------解决思路----------------------
SELECT BarCode,TestTime,TestResult,TesterID,CUT FROM(你试下这个
SELECT BarCode,TestTime,TestResult,TesterID
,Count(1)OVER(PARTITION BY BarCode) AS CUT
,ROW_NUMBER()OVER(ORDER BY TestTime DESC)RN
FROM(SELECT BarCode,TestTime,TestResult,TesterID
FROM T1
WHERE TestResult='F'
GROUP BY BarCode,TestTime,TestResult,TesterID
)T2
)T3
WHERE CUT>2 AND RN=1
------解决思路----------------------
SELECT BarCode,TestTime,TestResult,TesterID,CUT FROM(调整一下
SELECT BarCode,TestTime,TestResult,TesterID
,Count(1)OVER(PARTITION BY BarCode) AS CUT
,ROW_NUMBER()OVER(ORDER BY ID)RN
FROM(SELECT MIN(ID)ID,BarCode,TestTime,TestResult,TesterID
FROM T1
WHERE TestResult='F'
GROUP BY BarCode,TestTime,TestResult,TesterID
)T2
)T3
WHERE CUT>2 AND RN=1
------解决思路----------------------
/* 测试数据
WITH T1(ID,BarCode,TestTime,TestResult,TesterID) AS (
SELECT 1,'111','2015-03-13 13:30:30','F','a01' UNION ALL
SELECT 2,'111','2015-03-13 13:20:20','F','a01' UNION ALL
SELECT 3,'222','2015-03-13 13:40:33','F','b02' UNION ALL
SELECT 4,'111','2015-03-15 09:00:00','F','b03' UNION ALL
SELECT 5,'222','2015-03-13 13:40:33','F','b02' UNION ALL
SELECT 6,'222','2015-03-13 13:40:33','F','b02'
) */
SELECT D.*
FROM ( -- BarCode出现次数大于2且TestResult=F
SELECT BarCode
FROM T1
WHERE TestResult = 'F'
GROUP BY BarCode
HAVING COUNT(DISTINCT TestTime) > 2 -- 这里简单地用TestTime区分重复
) S
CROSS APPLY ( -- 每个BarCode分别取TestTime最大的一条明细
SELECT TOP 1 *
FROM T1
WHERE BarCode = S.BarCode
ORDER BY TestTime DESC
) D
ID BarCode TestTime TestResult TesterID
----------- ------- ------------------- ---------- --------
4 111 2015-03-15 09:00:00 F b03