SQL复合查询,求效率比较好的方法

最帅马老师 2009-12-25 11:34:01
问题描述如下:

生产中需要对产品进行高低温测试,产品的高温测试数据和常温测试数据放在同一个表中,假设这个表名为DbProduct,表的格式如下 :

id product_sn test_temperature data

id 表的索引
product_sn 产品S/N号
test_temperature 测试温度,一般有两个温度,25度和85度
data 测试数据

现在需要对这些数据进行筛选,
要求在25度时测试数据(data列)大于10,小于70,
要求在85度时测试数据(data列)大于0,小于30,
其中任何一项不符合要求都认为不合格

在表DbProduct中同一个产品S/N可能存在多个相同温度下的测试数据,比如产品S/N相同,但在25度下有可能有10个测试数据,以最后入库的那一条为准(目前我用的方法是判断ID最大的认为是最后入库的)

生成报表,报表分合格和不合格两部分,格式如下:

product_sn data_25 data_85 pass_or_not

product_sn 产品S/N号
data_25 25度数据
data_85 85度数据
pass_or_not 是否合格

我现在用轮询的方法进行生成报表,感觉速度不是很理想,请问有没有纯粹的SQL解决方案,请各位高手不吝赐教。
表的数据量在100万左右。

非常感谢
...全文
117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2009-12-25
  • 打赏
  • 举报
回复

select
product_sn,
min(data) as data_25,
max(data) as data_85,
case when min(data)>10 and min(data)<70 and max(data)>0 and max(data)<30 then 'Y' else 'N' end as pass_or_not
from
(
SELECT id , product_sn , test_temperature , data
FROM tb a
WHERE NOT EXISTS(
SELECT TOP 1 1
FROM tb
WHERE product_sn=a.product_sn
AND test_temperature= a.test_temperature
AND id>a.id
)
)tmp
GROUP BY product_sn
dawugui 2009-12-25
  • 打赏
  • 举报
回复

select * ,
(case when data_25 > 10 and data_25 < 70 and data_85 > 0 and data_85 < 30 then '合格' else '不合格' end) pass_or_not
from
(
select product_sn ,
max(case test_temperature when 25 then data else 0 end) data_25,
max(case test_temperature when 85 then data else 0 end) data_85
from
(
select t.* from DbProduct t where id = (select max(id) from DbProduct whenre product_sn = t.product_sn and test_temperature = t.test_temperature)
) m
group by product_sn
) n
Garnett_KG 2009-12-25
  • 打赏
  • 举报
回复

SELECT product_sn,data_25=MIN(data),
data_85=MAX(data),
pass_or_not=CASE WHEN MIN(data)>10 AND MIN(data)<70
AND
MAX(data)>0 AND MAX(data)<30
THEN 'Y'
ELSE 'N'
END
FROM
(
SELECT id , product_sn , test_temperature , data
FROM tb a
WHERE NOT EXISTS(
SELECT TOP 1 1
FROM tb
WHERE product_sn=a.product_sn
AND test_temperature= a.test_temperature
AND id>a.id
)
)tmp
GROUP BY product_sn
Mirana_NightShade 2009-12-25
  • 打赏
  • 举报
回复
up
dawugui 2009-12-25
  • 打赏
  • 举报
回复
第一个,改改:

--如果同一product_sn只有25,85这个两个数据
select product_sn from DbProduct
where (test_temperature = 25 and data > 10 and data < 70) or (test_temperature = 85 and data > 0 and data < 30)
group by product_sn
having count(1) > 1
--having count(1) = 2

--如果同一product_sn有多个数据
select * from DbProduct where product_sn in
(
select distinct product_sn from DbProduct
where (test_temperature = 25 and (data <= 10 or data >= 70)) or (test_temperature = 85 and (data <= 0 or data >= 30))
)
最帅马老师 2009-12-25
  • 打赏
  • 举报
回复
having count(1) > 1
--having count(1) = 2


这个地方是啥意思,我不明白?
--小F-- 2009-12-25
  • 打赏
  • 举报
回复
用case when 判断
not exists排除重复记录 取ID最大的值
dawugui 2009-12-25
  • 打赏
  • 举报
回复
第一个:


select product_sn from DbProduct
where (test_temperature = 25 and data > 10 and data < 70) or (test_temperature = 85 and data > 1 and data < 30)
group by product_sn
having count(1) > 1
--having count(1) = 2
最帅马老师 2009-12-25
  • 打赏
  • 举报
回复
首先谢谢各位,问题解决了
但各位的解决方法都有点小毛病,主要是在找ID最大的部分工作不正常(具体原因我还没弄清楚,但查询结果明显不对)

不过非常感激,分不多,给大家平均给了

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧