簡體   English   中英

如何獲得Oracle中不同記錄的最高排名?

[英]How to get a top count for distinct records in 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除去低於某個閾值會起作用,但似乎有點笨拙。

如果它更好,我可以制作一個臨時表,將我的不同值放入,然后從那里選擇,但似乎不應該是必要的。

我想這就是你要找的東西:

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

由於多層嵌套子查詢,它有點不優雅。 但是它應該是合理有效的。 按照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

第三種方法;)

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

暫無
暫無

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

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