我有一个Oracle查询,它会根据详细信息计算某些内容出现的次数。 它类似于:
SELECT COUNT(1) AS Num_Found, Column_A, Column_B, Column_C
FROM Some_Table
GROUP BY Column_A, Column_B, Column_C
我得到像这样的结果
|-----------|----------|----------|----------|
| Num_Found | Column_A | Column_B | Column_C |
| 145 | Acct1 | SubAcct1 | XXXX |
| 6 | Acct1 | SubAcct1 | yyyy |
| 346 | Acct2 | SubAcct2 | qwert |
| 97 | Acct2 | SubAcct2 | plkmn |
|-----------|----------|----------|----------|
我不确定如何根据Num_Found的最大数量获取Column_A,Column_B,Column_C。这样我就可以得到这样的结果:
|-----------|----------|----------|----------|
| Num_Found | Column_A | Column_B | Column_C |
| 145 | Acct1 | SubAcct1 | XXXX |
| 346 | Acct2 | SubAcct2 | qwert |
|-----------|----------|----------|----------|
答案 0 :(得分:1)
您按三列和结果组进行分组,您只希望保留两列中每个组合的最高分数?
可以通过以下方式完成:
select num_found, column_a, column_b, column_c
from (
SELECT COUNT(*) AS Num_Found, Column_A, Column_B, Column_C
, row_number() over (
partition by column_a, column_b
order by count(*) desc
) rn
FROM Some_Table
GROUP BY Column_A, Column_B, Column_C
)
where rn = 1
请注意,如果(对于相同的column_a,column_b组合)两个不同的column_c值具有相同的最高计数,那么它将是“随机的”,其中column_c值将在输出中。
答案 1 :(得分:0)
你想这样做吗?
SELECT t.*
FROM (SELECT COUNT(1) AS Num_Found, Column_A, Column_B, Column_C
FROM Some_Table
GROUP BY Column_A, Column_B, Column_C
ORDER BY COUNT(1) DESC
) t
WHERE rownum <= 2 ;
答案 2 :(得分:0)
试试这个。根据您想要的输出,看起来您想要按column_a
对结果进行分区选择
num_found,column_a,column_b,column_c
从
(
选择a。*,max(num_found)over(partition by column_a)为max_num
从
表a)
其中num = max_num