首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL grouping集合谜语

SQL grouping集合谜语
EN

Stack Overflow用户
提问于 2021-02-26 19:52:07
回答 1查看 68关注 0票数 0

给定一个“按行排序”列表(例如,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

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

代码语言:javascript
复制
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语句(表选项卡确实非常大)。例如,对于第一行,我可以使用以下语句:

代码语言:javascript
复制
SELECT F1,F2,F3,F4, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F4)

但是对于第二行,我不能使用下面的语句,因为它提供了与前一行相同的内容:

代码语言:javascript
复制
SELECT F1,F2,F3,F5, COUNT(*) FROM TAB GROUP BY CUBE(F1,F2,F3,F5)

最后,我希望获得所有104个不同的行,这些行是由:

代码语言:javascript
复制
/*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语句,而无需评估已经评估过的组(可能正在以某种方式使用分组集?)

EN

回答 1

Stack Overflow用户

发布于 2021-02-26 19:56:19

我想按所有可能的分组集('2‘到4’个分组集)逐行分组,不包括已经从以前的行求值的分组集,以避免得到重复项

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66385364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档