SQL分组设置谜语



给定一个'按行排序'的列表(例如n=4个元素),如:

F1, F2, F3, F4
F1, F2, F3, F5
F1, F2, F3, F6
F1, F2, F7, F4
F1, F2, F7, F5
F1, F2, F7, F6

,其中每个元素都是数据库表的一个字段,定义为:

CREATE TABLE TAB (F1 CHAR(1), F2 CHAR(1),  F3 CHAR(1), F4 CHAR(1), F5 CHAR(1), F6 CHAR(1), F7 CHAR(1));
INSERT INTO TAB VALUES ('A','B','C','D','E','F','G');
INSERT INTO TAB VALUES ('A','B','C','X','E','Y','G');
INSERT INTO TAB VALUES ('A','B','Z','X','E','Y','Q');

我想通过所有可能的分组集('2提高到4'分组集)分组,逐行,不包括分组集已经从以前的行评估,为了不得到重复,不使用'distinct'或'union' sql语句出于性能原因(表选项卡确实非常大)。例如,对于第一行,我可以使用语句:

SELECT F1,F2,F3,F4, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F4)

但是对于第二行,我不能使用下面的语句,因为它与前一行重复:

SELECT F1,F2,F3,F5, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F5)

最后,我想得到所有104行不同的结果:

/*104 records, bad performance for very large tables due to UNION statement 
and overhead in evaluating already evaluated groups*/
SELECT F1,F2,F3,F4, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F4) UNION 
SELECT F1,F2,F3,F5, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F5) UNION
SELECT F1,F2,F3,F6, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F6) UNION
SELECT F1,F2,F7,F4, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F7,F4) UNION
SELECT F1,F2,F7,F5, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F7,F5) UNION
SELECT F1,F2,F7,F6, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F7,F6) 

我想找到一种规则,让我使用6个标准SQL语句而不评估已经评估的组(可能以某种方式使用分组集?)

我想按所有可能的分组集('2提升到4'分组集)逐行分组,不包括已经从前一行评估的分组集,为了不得到重复

你可以使用cube并过滤掉你不想要的结果:

select t.*
from (select f1, f2, f3, f4, f5, f6, f7, count(*)
from t
group by cube (f1, f2, f3, f4, f5, f6, f7)
) f
where ( (case when f1 is not null then 1 else 0 end) +
(case when f2 is not null then 1 else 0 end) +
(case when f3 is not null then 1 else 0 end) +
(case when f4 is not null then 1 else 0 end) +
(case when f5 is not null then 1 else 0 end) +
(case when f6 is not null then 1 else 0 end) +
(case when f7 is not null then 1 else 0 end)
) = 4;

最新更新