给定一个“按行排序”列表(例如,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语句,而无需评估已经评估过的组(可能正在以某种方式使用分组集?)
发布于 2021-02-26 19:56:19
我想按所有可能的分组集('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;https://stackoverflow.com/questions/66385364
复制相似问题