4

一部のフィールドが重複している多数のレコードを含むテーブルがあります。これらの重複のそれぞれの中で最も一般的なものが必要です。

したがって、私のテーブルに以下のようなデータがある場合:

 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

ただし、フィールド 1 ごとに最大数のレコードのみが必要です。パーティションとサブクエリをめぐって rank() と戦ってきましたが、一意性のために 2 つのフィールドを使用し、カウントによってトップ レコードを選択するための正しい構文が見つかりませんでした。探していて、確かにこれが尋ねられたのですが、見つかりません。

以下を取得したい

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

目標は、少しだけ間違ったデータ (フィールド 1 とフィールド 2 の間のリンクが間違っている) を含むテーブルを見て、それが通常のデータに基づいてどうあるべきかを判断することです。悪いレコードがいくつあるかわからないので、特定のしきい値を下回る Count を削除することはできますが、少しぎこちないようです。

より良い場合は、個別の値を入れてそこから選択する一時テーブルを作成できますが、それは必要ないようです。

4

3 に答える 3

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

于 2012-12-04T18:41:05.533 に答える
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
于 2012-12-04T18:30:50.060 に答える
2

そして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

于 2012-12-04T18:44:47.487 に答える