2 sosoben sosoben 于 2015.06.06 09:35 提问

数据库一项特殊的统计,求高效率点的算法

有一个数据表
ID time pos result
1 15:00:1 1 true
1 15:00:1 2 true
1 15:00:1 3 true
1 15:00:1 4 true
1 15:00:2 1 true
1 15:00:2 2 true
3 15:00:1 1 true
3 15:00:1 2 False
3 15:00:1 3 true
3 15:00:1 4 true

如上: 在ID time 作为唯一标识的情况下 Pos项要有1 2 3 4 四项全有才算一组完整数据, 如果其result全为true则为true, 例: 1 15:00:1为true

同理 3 15:00:1 为 false, 1 15:00:2 为无效数据

如果有多项 ID 为 1的完整数据 ,则统计时以最晚的为准

整个数据库少的有几千行,多的有几万,我要统计其true的比例,而且怎么样统计才是效率较高呢?? SQL能做到?

4个回答

xiaoxiao081228
xiaoxiao081228   2015.06.06 12:07
已采纳

select * from table a where exists(select pk from (select count(*) n ,pk from table group by pk) b where a.pk = p.pk and n >3) and result = true
这个应该比较完整

sosoben
sosoben 回复小小summer: 怎样把这两个主键联合起来编程PK呢?
2 年多之前 回复
xiaoxiao081228
xiaoxiao081228 回复sosoben: pk是主键的意思,你说ID time唯一标识,所以么pk就是id 和time的联合主键
2 年多之前 回复
sosoben
sosoben 哦 结合 你上一个答案,我大概明白你是什么意思了 我修改如下 select * from [table] a where exists(select time from (select count(*) as n ,time from (select distinct * from [table]) group by time) as b where a.time = b.time and n > 3) 即数出ID time 相同但pos不同的个数大于3的数据.
2 年多之前 回复
sosoben
sosoben 再仔细研究了下select count(*) as n ,pos from [table] group by pos 这句数出了 pos 1 2 3 4的各有多少个 ,但我的数据很多条,数出来一定大于3(n>3)的啊 所以这条不明白,请指教
2 年多之前 回复
sosoben
sosoben 不好意思 我按照我的理解改成了select * from [table] a where exists(select pos from (select count(*) as n ,pos from [table] group by pos) as b where a.pos = b.pos and n > 7) 得出的结果没有排除类似 1 15:00:2 这样不全的无效数据
2 年多之前 回复
sosoben
sosoben pk 是pos? a是原表? 问题来了 p是什么?
2 年多之前 回复
Juforg
Juforg   2015.06.10 18:54

在 Oracle 10g 中试验 其它数据库可能得换函数

原始数据

图片说明
##分组 取目标result

SELECT t.id,t.time,SUM(POS) pos2,MIN(t.result) res,ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.time DESC) AS rn
 FROM to_delete t GROUP BY t.id,t.time ORDER BY id,t.time DESC

图片说明
##统计

SELECT t3.res,COUNT(1) c FROM (
SELECT t.id,t.time,SUM(POS) pos2,MIN(t.result) res,ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY t.time DESC) AS rn
 FROM to_delete t GROUP BY t.id,t.time ORDER BY id,t.time DESC
 ) t3 WHERE t3.pos2=10 AND rn=1 GROUP BY t3.res

图片说明

sosoben
sosoben 很厉害! 但我没用过Oracle 所以暂时没法验证,有些函数也不知道怎么转到access sql,而且已经采用了楼上的思路了 ,sorry
2 年多之前 回复
xiaoxiao081228
xiaoxiao081228   2015.06.06 10:00

select * from table where pos in (1,2,3,4) and result =true

xiaoxiao081228
xiaoxiao081228 回复sosoben: 没写完而已,这里呢第一步先要确定的是同一个主键下1,2,3,4是否会重复。不会呢,就可以采用比较原始的方法,select * from table a where exists(select pk from (select count(*) n ,pk from table group by pk) b where a.pk = p.pk and n >3)
2 年多之前 回复
sosoben
sosoben 明显不行,这样只能查找含有(1或2或3或4)的项,而不是在ID time唯一的情况下 1,2,3,4全都有的项
2 年多之前 回复
frank_20080215
frank_20080215   2015.06.06 10:51

太那个了,哪有这样做Table的primary key

sosoben
sosoben 因为每一条后面还有很多数据(30多项吧) ,我只是省略了不写. 对于单条分类统计还是有他的意义的
2 年多之前 回复
sosoben
sosoben 因为每一条后面还有很多数据(30多项吧) ,我只是省略了不写. 对于单条分类统计还是有他的意义的
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片