日期:2014-05-17 浏览次数:21043 次
--1. with student as( select '一班' class,'李一' name, 100 score from dual union all select '一班' class,'李二' name, 100 score from dual union all select '一班' class,'李三' name, 100 score from dual union all select '一班' class,'李四' name, 100 score from dual union all select '一班' class,'李五' name, 99 score from dual union all select '一班' class,'李六' name, 98 score from dual union all select '二班' class,'王一' name, 100 score from dual union all select '二班' class,'王二' name, 100 score from dual union all select '二班' class,'王三' name, 99 score from dual union all select '二班' class,'王四' name, 98 score from dual union all select '二班' class,'王五' name, 80 score from dual), tt as( SELECT t.*, row_number() over(PARTITION BY CLASS ORDER BY score DESC) rn FROM student t) SELECT a.class, a.name, a.score, b.mrn FROM tt a, (SELECT CLASS, score, MIN(rn) mrn FROM tt GROUP BY CLASS, score) b WHERE a.class = b.class AND a.score = b.score; --2.先用集合运算不知效率怎样 SELECT COUNT(*) FROM (SELECT * FROM a INTERSECT SELECT * FROM b);
------解决方案--------------------
1:直接用DENSE_RANK()函数不是更好?
2:select count(*) from A,B where A.id=B.id。没有执行计划,没有表结构,我的水平还没有到这个程度。。。难道用EXIST做?
3:总数量验证,SQL语句的WHERE条件审查,数据仓库分析结果验证,感觉就这样了,简单的验证。。。。
------解决方案--------------------
1:我觉得用rank()比较好实现排名,不知道row_number()怎么实现这种排名
2:首先从表连接方式,然后分区、并行
3;不知道,我只能说,我在分析需求时,会尽量把问题澄清,不知道此处强调数据仓库,有什么意思
期待高人给出解释
------解决方案--------------------
我也来看看:
1.一班 李一 100 1
一班 李二 100 1
一班 李三 100 1
一班 李四 100 4 (数据有误?这是为啥是4?)
2.select count(*) from A,B where A.id=B.id
这个语句就写法上来说,是最简洁的。
1)假如是OLAP之类的系统,可以使用位图索引(传说中位图索引对COUNT这种运算相当地快)
2) OLTP,2张表都得有索引,fast full scan 2个表的索引再hash join(其中A为驱动表), 速度应该是OK的了。