SQL - 按分组集中的小计计数排序
SQL - Order By Subtotal Count in a Grouping Set
这是我目前的陈述:
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNT(*) COUNTER
FROM
TABLE
GROUP BY
GROUPING SETS ((COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5), COLUMN1);
我以前从未使用过 GROUPING SETS,所以我不确定我是否正确使用它们,但我的输出看起来是正确的。但我缺少的是我想按我的小计 COUNTER 排序,然后按我的 COLUMN1 排序。我当前的输出如下:
COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COUNTER
TEST0 TEST1 TEST3 TEST3 TEST4 1
TEST0 1
TEST TEST TEST TEST TEST 1
TEST TEST1 TEST1 TEST1 TEST1 1
TEST TEST2 TEST2 TEST3 TEST4 1
TEST 3
TEST2 TEST3 TEST4 TEST5 TEST6 1
TEST2 1
我想要的输出是:
COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COUNTER
TEST TEST TEST TEST TEST 1
TEST TEST1 TEST1 TEST1 TEST1 1
TEST TEST2 TEST2 TEST3 TEST4 1
TEST 3
TEST0 TEST1 TEST3 TEST3 TEST4 1
TEST0 1
TEST2 TEST3 TEST4 TEST5 TEST6 1
TEST2 1
按 COUNTER 小计从大到小排序,然后按 COLUMN1 排序。
您可以将 MAX 函数用作分析函数来对结果进行排序。
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNTER
FROM (
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNTER,
MAX(counter) KEEP (DENSE_RANK FIRST ORDER BY counter DESC) OVER (PARTITION BY first_name) AS maxcount
FROM (
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNT(*) AS COUNTER
FROM
TABLE
GROUP BY GROUPING SETS ((COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5), COLUMN1)
)
)
ORDER BY maxcount DESC, COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5;
您还可以更改 ORDER BY 以调整您希望的结果排序方式。
我上周刚刚写了一篇关于 GROUP BY 和相关函数的文章,可能会有帮助:Oracle GROUP BY – The Complete Guide。我必须对其进行更新以添加此订购功能。
这是我目前的陈述:
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNT(*) COUNTER
FROM
TABLE
GROUP BY
GROUPING SETS ((COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5), COLUMN1);
我以前从未使用过 GROUPING SETS,所以我不确定我是否正确使用它们,但我的输出看起来是正确的。但我缺少的是我想按我的小计 COUNTER 排序,然后按我的 COLUMN1 排序。我当前的输出如下:
COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COUNTER
TEST0 TEST1 TEST3 TEST3 TEST4 1
TEST0 1
TEST TEST TEST TEST TEST 1
TEST TEST1 TEST1 TEST1 TEST1 1
TEST TEST2 TEST2 TEST3 TEST4 1
TEST 3
TEST2 TEST3 TEST4 TEST5 TEST6 1
TEST2 1
我想要的输出是:
COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 COUNTER
TEST TEST TEST TEST TEST 1
TEST TEST1 TEST1 TEST1 TEST1 1
TEST TEST2 TEST2 TEST3 TEST4 1
TEST 3
TEST0 TEST1 TEST3 TEST3 TEST4 1
TEST0 1
TEST2 TEST3 TEST4 TEST5 TEST6 1
TEST2 1
按 COUNTER 小计从大到小排序,然后按 COLUMN1 排序。
您可以将 MAX 函数用作分析函数来对结果进行排序。
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNTER
FROM (
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNTER,
MAX(counter) KEEP (DENSE_RANK FIRST ORDER BY counter DESC) OVER (PARTITION BY first_name) AS maxcount
FROM (
SELECT
COLUMN1,
COLUMN2,
COLUMN3,
COLUMN4,
COLUMN5,
COUNT(*) AS COUNTER
FROM
TABLE
GROUP BY GROUPING SETS ((COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5), COLUMN1)
)
)
ORDER BY maxcount DESC, COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5;
您还可以更改 ORDER BY 以调整您希望的结果排序方式。
我上周刚刚写了一篇关于 GROUP BY 和相关函数的文章,可能会有帮助:Oracle GROUP BY – The Complete Guide。我必须对其进行更新以添加此订购功能。