1

私はこれに頭をぶつけてきました。私は近いと思います。(オラクル、SQL)

次のようなテーブルがあります。

Company    Code
Apple      A
Google     A
Microsoft  B
Apple      C
Google     B
Microsoft  B
Apple      C
Google     C
Microsoft  B

各企業は複数のコードに解決できます。私がやりたいことは、各会社について、最も頻繁に現れるコードを持つ会社を提供する SQL ステートメントを作成することです。だから私の例では、私は得るだろう

Apple      C
Google     <nothing since there's no clear max>
Microsoft  B

これまでにまとめたものは次のとおりです。このクエリは、コードが最も多く表示される会社を返しますが、ある会社の 2 つのコードが一致している場合は、両方が返されます。私の例の Google の場合、(Google, A), (Google, B), (Google, C) を取得します。何も返してほしくない。

重複した会社を除外するために、すべてをそれ自体といくつかの追加の where 句で再び結合できると思いますが、これを行うためのより良い方法があるかどうか疑問に思っていました。私を殺しているのは、Oracleの単一グループグループエラーが発生することがあるため、group byと一緒の集計関数です。任意の提案をいただければ幸いです。

SELECT m1, c.company sp1, b.code ul1 FROM
  (SELECT MAX(c1) m1, company FROM
    (SELECT COUNT(company||code) c1, company, code FROM table GROUP BY company, code ) a
  GROUP BY company) c
left OUTER JOIN
  (SELECT COUNT(company||code) c1, company, code FROM table GROUP BY company, code ) b
ON c.company=b.company and
m1=b.c1;

mj

4

3 に答える 3

3

あなたはこれでそれを行うことができます:

select company, case when c > 1 then null else code1 end code1
  from (select company, code1, recs, count(*) over (partition by company, recs ) c, 
           row_number() over (partition by company order by recs desc) rn
  from (select company, code1, count(*) recs
          from table
         group by company, code1))
 where rn = 1
 order by 1

これを分解する:

select company, code1, count(*) recs
 from table
 group by company, code1

これにより、各企業のコード数がわかります。

COMPANY   C       RECS
--------- - ----------
Google    A          1
Google    B          1
Microsoft B          3
Apple     A          1
Apple     C          2
Google    C          1

このことから、最も人気のあるものが必要です。分析でこれを行います:

select company, code1, recs,
       row_number() over (partition by company order by recs desc) rn
  from (select company, code1, count(*) recs
          from t1
         group by company, code1)

与える:

COMPANY   C       RECS         RN
--------- - ---------- ----------
Apple     C          2          1 <- we want all rn= "1" rows
Apple     A          1          2
Google    A          1          1<- we want all rn= "1" rows
Google    B          1          2
Google    C          1          3
Microsoft B          3          1<- we want all rn= "1" rows

しかし、重複がある場合(googleのように).. RN = 1の行をcount(*)します。

select company, code1, recs,
       row_number() over (partition by company order by recs desc) rn,
       count(*) over (partition by company, recs ) c
  from (select company, code1, count(*) recs
          from t1
         group by company, code1)

与える

COMPANY   C       RECS         RN          C
--------- - ---------- ---------- ----------
Apple     C          2          1          1
Apple     A          1          2          1
Google    A          1          1          3
Google    B          1          2          3
Google    C          1          3          3
Microsoft B          3          1          1

したがって、RN=1およびc=1であると言う必要があります(つまり、1つの行だけがその数のレコードを持っていたので、最終的には次のようになります。

select company, case when c > 1 then null else Code1 end Code1
  from (select company, code1, recs, count(*) over (partition by company, recs ) c, 
           row_number() over (partition by company order by recs desc) rn
  from (select company, code1, count(*) recs
          from t1
         group by company, code1))
 where rn = 1

つまり、rn = 1であり、c> 1チェックは上部のケースにあります(行を除外したくないので、あいまいとしてマークするだけです。

于 2012-11-12T18:03:25.567 に答える
1

試す

with
tcount as
(
select t.company, t.code, count(*) c
from table1 t 
group by t.company, t.code) 

select distinct tt.company,
decode(count(tt.company) over(partition by tt.company),
1,
tt.code,
null)
from tcount tt
where tt.c =
(select max(c) from tcount tti where tt.company = tti.company) 

ここにフィドルがあります

于 2012-11-12T18:12:40.940 に答える
0
SELECT company,CASE WHEN count_ > 1 THEN NULL ELSE code END
(
SELECT company,MAX(code) code,count(1) count_
(SELECT company,code,rank() OVER(PARTITION BY company ORDER BY count_ DESC) rn FROM
(
select
       company,code,count(1) count_
from   table
group by
       company,code
) 
)
where rn = 1
GROUP BY 
   company
)
于 2013-06-06T01:42:44.933 に答える