Oracle:在select查询中查找重复的行

时间:2012-12-08 09:14:56

标签: sql oracle count duplicates

我的SQL查询返回4列“A”,“B”,“C”,“D”的结果。

假设结果是:

A    B    C    D
1    1    1    1
1    1    1    2
2    2    2    1

是否可以获得每行中包含“A”,“B”,“C”列的重复行数。

e.g。预期的结果是:

A    B    C    D    cnt
1    1    1    1    2
1    1    1    2    2
2    2    2    1    1

我尝试使用count(*)结束。但它返回查询返回的总行数。 另一个信息是,在示例中,我只提到了3列,我需要根据这些列检查计数。但我的实际查询有8列。并且数据库中的行数很大。所以我认为分组在这里不是一个可行的选择。 任何提示都很明显。 感谢。

3 个答案:

答案 0 :(得分:7)

也许为时已晚,但可能在oracle中作为分析函数(aka window函数)的计数可以帮助您。当我正确理解您的请求时,这应该可以解决您的问题:

create table sne_test(a number(1)
                 ,b number(1)
                 ,c number(1)
                 ,d number(1)
                 ,e number(1)
                 ,f number(1));

insert into sne_test values(1,1,1,1,1,1);
insert into sne_test values(1,1,2,1,1,1);
insert into sne_test values(1,1,2,4,1,1);
insert into sne_test values(1,1,2,5,1,1);
insert into sne_test values(1,2,1,1,3,1);
insert into sne_test values(1,2,1,2,1,2);
insert into sne_test values(2,1,1,1,1,1);

commit;

 SELECT a,b,c,d,e,f, 
       count(*) over (PARTITION BY a,b,c)
  FROM sne_test;

 A  B  C  D  E  F AMOUNT
-- -- -- -- -- -- ------
 1  1  1  1  1  1      1
 1  1  2  4  1  1      3
 1  1  2  1  1  1      3
 1  1  2  5  1  1      3
 1  2  1  1  3  1      2
 1  2  1  2  1  2      2
 2  1  1  1  1  1      1

答案 1 :(得分:3)

要查找重复项,您必须根据键列

对数据进行分组
select 
  count(*)
  ,empno 
from 
  emp
group by
  empno
having
  count(*) > 1;

即使每个类别(多个)存在多个记录,这也允许您按empno进行汇总。

答案 2 :(得分:2)

您必须使用子查询来获取行数,按A,B和C分组。然后再次使用您的表(或查询)加入此子查询,如下所示:

select your_table.A, your_table.B, your_table.C, your_table.D, cnt
from
  your_table inner join
  (SELECT A, B, C, count(*) as cnt
   FROM your_table
   GROUP BY A, B, C) t
  on t.A = your_table.A
     and t.B = your_table.B
     and t.C = your_table.C