[英]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.