簡體   English   中英

SQL 分組集謎

[英]SQL grouping sets riddle

給定一個“按行排序”列表(例如 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' 分組集)逐行分組,不包括已經從前幾行評估的分組集,以免重復並且不使用“不同”或“聯合” ' 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;
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM