Chinaunix

标题: 请教数据筛选问题!!!!急----高手请进 [打印本页]

作者: okchina    时间: 2006-05-18 11:57
标题: 请教数据筛选问题!!!!急----高手请进
1)情况如下
表结构:
编号       日期     时间         结果
00001        ---         01:00:00       F
00001        ---         02:00:00       F
00001        ---         03:00:00       F  
00001        ---         04:00:00       P
00002        ---         ----        P
00003        ---         ----        P
00004        ---         ----        P
00005        ---         ----        P
00006        ---         ----        P
00007        ---         ----        P
00008       ---         ----        P
00009        ---         ----        P
00010        ---         ----        P


2)要求
得出测量结果的良率
主意.  所有的编号都有可能重复,而且结果不一致,如0001产品,就测量了4次,但是根据时间判断,最后一次的结果是"P"所以认为也是合格的.但是只能算一个产品,因为良率是对产品而言的.

能否用最简单的SQL语句实现?

3)疑惑
如果用Group功能,但是不一定结果是"P",还有根据时间判断最后一次

4)目前方法:
遍历所有的编号,然后再对某个编号再排序,然后记录结果,最后计算良率

缺点:系统以及服务器开销太大.

请教高手指点!!!
作者: yejr    时间: 2006-05-18 12:47
这种情况下想单独通过一个sql来实现似乎不行,至少我没想出来
一个改进的办法是新增一个统计表,每个产品只保留最后测试的那条记录,这样就方便多了
作者: xxjoyjn    时间: 2006-05-18 12:49
恩,是个办法
作者: okchina    时间: 2006-05-18 12:56
原帖由 yejr 于 2006-5-18 12:47 发表
这种情况下想单独通过一个sql来实现似乎不行,至少我没想出来
一个改进的办法是新增一个统计表,每个产品只保留最后测试的那条记录,这样就方便多了


那你的意思就是要修改记录数据的系统了,使其只保留最后的记录.
如果能做到的话,我何不直接记录有用的数据.

谢谢你的建议

我还在寻找好的方法......
作者: okchina    时间: 2006-05-18 13:02
4)目前方法:
遍历所有的编号,然后再对某个编号再排序,然后记录结果,最后计算良率

缺点:系统以及服务器开销太大.


这种方法需要2个大循环才能实现,已经开销很大了,
事实上,我在外面还有一个循环,因为我没法得到编号,只能从另外的地方得到.

我们算一下;

如果有100个小包裹,每个小包裹里有100个编号的产品.每个产品最少测量1次,有的要2-4次
这样的循环就是100*100*(1-4)
如果我每天有50000个小包裹,那就不可想象了.
作者: rardge    时间: 2006-05-19 12:02
说实话,我没看懂你的意思。
那么象版主说的,只要能提取每个编号最后一次的测量记录是不是就行了?
计算良品率应该是你程序做吧?还是用 SQL 做?
作者: okchina    时间: 2006-05-19 13:14
原帖由 rardge 于 2006-5-19 12:02 发表
说实话,我没看懂你的意思。
那么象版主说的,只要能提取每个编号最后一次的测量记录是不是就行了?
计算良品率应该是你程序做吧?还是用 SQL 做?


你的建议是不错.

现在问题是数据的量很巨大,提取每个编号的最后一次测量记录是不是也是用SQL语句做呢?
如果我有100万个编号,每个编号最少测量一次,我们假定最多测量3次,
这样的系统开销光得出每个编号最后的记录就要用100万*2(平均次数)=200万
这样还只是得出最后的测量记录.我们还要根据其它信息做分类汇总,这也要SQL做吧?

良率是用程序做,但是得出计算良率的数据是要嵌套的SQL得出的.
作者: rardge    时间: 2006-05-19 13:40
呵呵,数据量大的问题就没办法了,你实际测试过没,耗时多少?实在太慢就要修改结构了。
你的 SQL 语句怎么样的?
一次性取出最新的记录不需要你说的遍历然后再排序什么的,直接两个 order by 加 group by 即可。
.... order by 日期 desc, 时间 desc group by 编号
作者: okchina    时间: 2006-05-23 10:44
原帖由 rardge 于 2006-5-19 13:40 发表
呵呵,数据量大的问题就没办法了,你实际测试过没,耗时多少?实在太慢就要修改结构了。
你的 SQL 语句怎么样的?
一次性取出最新的记录不需要你说的遍历然后再排序什么的,直接两个 order by 加 group by 即可 ...


1)修改表结构有什么好的建议?
2)你说的order by 加 group by,  我不知道哪个数据库支持,我用的是 Mysql 4.0.X
作者: yejr    时间: 2006-05-23 11:31
group by 一直都支持
作者: okchina    时间: 2006-05-23 13:25
原帖由 yejr 于 2006-5-23 11:31 发表
group by 一直都支持


不错!
我发现 :
如果先order by 再 group by 的话,就会出错
如果先 group by再 order by 的话就没有问题,但是得出的结果还不是我想要的.


例如:

table:

sn        date    time    result
a001                           P
a002                            P
a003                            F

SQL语句

select * from table where date='2006-05-23'
group by sn
order by time

如果有个记录,共测量3次,按照时间先后:
a001  08:00:01   F
a001  08:00:02   F
a001  08:00:03   P



无论你用在ORDER By time 时用DESC 还是ASC得出的这个sn的结果都是"F"
因为SQL语句是先group 再order 的,所以得出的结果总是08:00:01的那个数据!!!
但是实际上我要得是最后的一个结果!!!
作者: rardge    时间: 2006-05-23 13:33
不好意思,给错了。
select * from (select * from TB where ... order by aa desc, bb desc ....) as TMP group by ccc
作者: anthonyfeng    时间: 2006-05-23 14:02
这样行不行

最后一次测试结果:先group by sn, 再用max(time) 找最近的测试结果
select *,max(time) from db group by sn

良率:把pass 值改为int 1, fault 值改为 int 0, 先group by sn, sum(结果) / count(结果)  = 良率

请多指教。
作者: okchina    时间: 2006-05-24 10:59
原帖由 rardge 于 2006-5-23 13:33 发表
不好意思,给错了。
select * from (select * from TB where ... order by aa desc, bb desc ....) as TMP group by ccc



我试过了,4.0.X不行
但是4.1.18可以!!!
看样子需要升级MySql了

哈哈




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2