|
原帖由 newkid 于 2010-2-12 03:22 发表 ![]()
GROUP BY CUBE 相当于对所有的列组合做聚合运算,然后把这些结果合并起来。假如CUBE里有N个列,就有2^N种组合。
以三个列为例,
SELECT c1,c2,c3,SUM(amount)
FROM T
GROUP BY CUBE (c1,c2,c3);
相当于:
SELECT c1,c2,c3,SUM(amount)
FROM T
GROUP BY c1,c2,c3
UNION ALL
SELECT c1,NULL c2,NULL c3,SUM(amount)
FROM T
GROUP BY c1
UNION ALL
SELECT NULL c1,c2,NULL c3,SUM(amount)
FROM T
GROUP BY c2
UNION ALL
SELECT NULL c1,NULL c2,c3,SUM(amount)
FROM T
GROUP BY c3
UNION ALL
SELECT c1,c2,NULL c3,SUM(amount)
FROM T
GROUP BY c1,c2
UNION ALL
SELECT c1,NULL c2,c3,SUM(amount)
FROM T
GROUP BY c1,c3
UNION ALL
SELECT NULL c1,c2,c3,SUM(amount)
FROM T
GROUP BY c2,c3
UNION ALL
SELECT NULL c1,NULL c2,NULL c3,SUM(amount)
FROM T
GROUP BY NULL
你要不要来挑战一下ORACLE的效率?也就是说你自己把数据读取出来,按这些组合来做聚合运算。注意别用到GROUP BY,否则你还是在借助ORACLE做聚合。
学习了,多谢。
你还是没理解DAU,DAU是帮助你写SQL语句,这语句DAU完全能写出来并映射到结构。
DAU的新发展:利用元数据自动构建模板和数据结构。
元数据(cube.meta):
TEMPLATE cube 4
c1:=CH_CHAR 28
c2:=CH_CHAR 28
c3:=CH_CHAR 28
sum(amount) sum:=CH_INT
T
---------------------------------------------
mktpl <cube.meta
元文件生成了数据结构 cube_stu和模板cube_tpl,把他们包含到你的C程序中。然后:
cube_stu cube;
DAU cube_DAU;
int ret;
char stmt[4096];
DAU_init(&cube_DAU,SQL_Connect,0,&cube,cube_tpl);
sprintf(stmt,"GROUP BY CUBE (c1,c2,c3)");
ret=DAU_prepare(cube_DAU,stmt);
//if ret == 0
while(!DAU_next(&cube_DAU)) {
//使用你的cube结构吧
}
DAU_free(&cube_DAU);
DAU帮助你使用ORACLE的一切优秀特性,为什么要回避ORACLE?
[ 本帖最后由 yulihua49 于 2010-2-15 22:18 编辑 ] |
|