2012-12-04 61 views
4

我有許多記錄與一些字段重複的表。我想要這些重複中最常見的一個。如何在Oracle中獲得不同記錄的最高計數?

所以,如果我的表中有像下面的數據:

ID  Field1  Field2 
    1  A   10 
    2  A   12 
    3  B   5 
    4  A   10 
    5  B   5 
    6  A   10 
    7  B   8 
    8  B   5 
    9  A   10 

我可以選擇不同的,並得到數:

select distinct Field1, Field2, count(Field1) 
from Table 
group by Field1, Field2 
order by Field1, count(Field1) desc 

這會給我

Field1 Field2  Count 
A   10   4 
A   12   1 
B   5   3 
B   8   1 

然而,我只想要每個Field1的計數最高的記錄。我一直在使用分區和子查詢的rank(),但還沒有找到正確的語法來使用兩個字段的唯一性,並通過計數選擇最高記錄。我一直在尋找,我確信這已經被問到,但我找不到它。

我希望得到以下

Field1  Field2  (optional) Count 
A   10   4 
B   5   3 

的目標是看有不正確的數據(FIELD1和FIELD2錯之間的連接)的只是一點點的表,並確定它應該是基於它通常是什麼。我不知道有多少壞記錄,因此將Count降至特定閾值以下會有效,但似乎有點不便。

如果更好,我可以創建一個臨時表,將不同的值放入,然後從那裏選擇,但似乎並不是必須的。

回答

6

我認爲這是你在找什麼:

select field1, field2, cnt from 
(select field1, field2, cnt, rank() over (partition by field1 order by cnt desc) rnk 
from (select distinct Field1, Field2, count(Field1) cnt 
      from Table1 
      group by Field1, Field2 
      order by Field1, count(Field1) desc) 
) 
where rnk = 1; 

SQL小提琴:http://sqlfiddle.com/#!4/fe96d/3

+0

這工作,似乎是相當有效的。 – thursdaysgeek

2

由於多層嵌套子查詢,這有點不雅觀。但它應該是合理的效率。它應該是相當容易遵循SQL的步驟

SQL> ed 
Wrote file afiedt.buf 

    1 with x as (
    2 select 1 id, 'A' field1, 10 field2 from dual union all 
    3 select 2, 'A', 12 from dual union all 
    4 select 3, 'B', 5 from dual union all 
    5 select 4, 'A', 10 from dual union all 
    6 select 5, 'B', 5 from dual union all 
    7 select 6, 'A', 10 from dual union all 
    8 select 7, 'B', 8 from dual union all 
    9 select 8, 'B', 5 from dual union all 
10 select 9, 'A', 10 from dual 
11 ) 
12 select field1, 
13   field2, 
14   cnt 
15 from (select field1, 
16     field2, 
17     cnt, 
18     rank() over (partition by field1 
19         order by cnt desc) rnk 
20   from (select field1, field2, count(*) cnt 
21     from x 
22     group by field1, field2)) 
23* where rnk = 1 
SQL>/

F  FIELD2  CNT 
- ---------- ---------- 
A   10   4 
B   5   3 
+0

這工作,似乎是相當高效。 – thursdaysgeek

+1

我們是如何編寫相同的確切的SQL,直到計數和等級的別名?你是我嗎? – ivanatpr

2

和第三種方法)

select field1, 
     field2, 
     max_cnt 
from (
    select field1, 
     field2, 
     cnt, 
     max(cnt) over (partition by field1, field2) as max_cnt, 
     row_number() over (partition by field1 order by cnt desc) as rn 
    from (
     select field1, 
      field2, 
      count(*) over (partition by Field1, Field2) as cnt 
     from idlist 
) t1 
) t2 
where max_cnt = cnt 
and rn = 1 

SQLFiddle:http://sqlfiddle.com/#!4/8461f/1

+0

雖然它看起來不像其他人那麼快,但它起作用。謝謝。 – thursdaysgeek