如何使用row_number和partition by查找重复值

时间:2015-06-10 05:43:14

标签: sql oracle duplicates

我想知道如何使用以下查询获取所有重复值。请告诉我我的查询错误。

的问候, 伊夫泰哈

SQL> desc tmp_emp_Area
 Name                            Null?    Type
 ------------------------------- -------- ----
 SC_CD                                    VARCHAR2(2)
 DIST_CD                                  VARCHAR2(2)
 THA_CD                                   VARCHAR2(2)
 UN_CD                                    VARCHAR2(3)
 FP_ID                                    VARCHAR2(4)
 S_DT                                     DATE
 END_DT                                   DATE
 PERFORM                                  VARCHAR2(1)
 BS_CD                                    VARCHAR2(4)
 MKT_CD                                   VARCHAR2(3)

查询:

  SELECT SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID,
    row_number() over(partition BY SC_CD, DIST_CD, THA_CD, UN_CD, FP_ID order by FP_ID) rn
    FROM tmp_emp_area
    WHERE rn >1
  

SQL> / WHERE> 1         *第4行的错误:ORA-00904:" RN":无效的标识符

请检查以下两个结果,我在运行两个不同的查询后获得重复项。一个显示92列,另一个显示96列。

select SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID,count(fp_id)  
from tmp_emp_area 
group by SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID 
having count(fp_id)>1
/

SC DI TH UN_ FP_I COUNT(FP_ID)
-- -- -- --- ---- ------------
14 61 02 022 5J85            2
14 61 02 098 5J85            3
14 64 02 004 5J85            2
14 64 02 002 5J85            2
14 60 19 060 5F77            2
14 60 13 077 5F77            2
14 61 06 006 5D51            2
14 61 07 013 5D51            2
14 61 07 083 5D51            2
14 61 06 010 5D51            2
14 61 01 015 5R44            2
14 61 08 027 5R44            2
14 61 01 057 5R44            2
14 61 01 067 5R44            2
14 61 05 001 5R44            2
14 61 05 003 5R44            2
14 61 02 009 5J85            2
14 60 13 078 5F77            2
14 61 06 007 5D51            2
14 61 01 021 5R44            2
14 61 01 029 5R44            2

SC DI TH UN_ FP_I COUNT(FP_ID)
-- -- -- --- ---- ------------
14 61 01 065 5R44            2
14 61 01 069 5R44            2
14 64 03 013 5J85            2
14 61 02 014 5J85            2
14 61 02 089 5J85            2
14 60 19 132 5F77            2
14 60 19 134 5F77            2
14 61 07 086 5D51            2
14 61 06 035 5D51            2
14 61 06 014 5D51            2
14 61 01 031 5R44            2
14 61 01 036 5R44            2
14 61 01 041 5R44            2
14 61 02 092 5J85            3
14 61 02 074 5J85            3
14 61 02 088 5J85            2
14 61 02 109 5J85            2
14 60 19 014 5F77            2
14 61 07 015 5D51            2
14 61 06 008 5D51            2
14 61 06 016 5D51            2

SC DI TH UN_ FP_I COUNT(FP_ID)
-- -- -- --- ---- ------------
14 61 05 047 5R44            2
14 61 01 018 5R44            2
14 61 01 055 5R44            2
14 61 01 066 5R44            2
14 61 01 024 5R44            2
14 61 02 093 5J85            3
14 64 02 011 5J85            2
14 64 02 003 5J85            2
14 61 09 002 5J85            2
14 61 02 081 5J85            2
14 61 05 053 5D51            2
14 61 07 087 5D51            2
14 61 06 036 5D51            2
14 61 06 020 5D51            2
14 61 01 076 5R44            2
14 61 02 059 5R44            2
14 61 02 033 5J85            2
14 64 02 008 5J85            2
14 64 02 020 5J85            2
14 61 02 097 5J85            2
14 61 02 017 5J85            2

SC DI TH UN_ FP_I COUNT(FP_ID)
-- -- -- --- ---- ------------
14 61 02 082 5J85            2
14 61 01 077 5R44            2
14 61 05 046 5R44            2
14 61 01 017 5R44            2
14 61 01 054 5R44            2
14 64 02 030 5J85            2
14 61 02 010 5J85            2
14 61 02 103 5J85            2
14 64 02 006 5J85            2
14 64 03 020 5J85            2
14 61 02 105 5J85            2
14 61 02 080 5J85            2
14 61 02 151 5J85            2
14 60 19 059 5F77            2
14 61 06 045 5D51            2
14 61 01 075 5R44            2
14 61 01 056 5R44            2
14 61 01 020 5R44            2
14 61 05 007 5R44            2
14 61 01 053 5R44            2
14 61 01 078 5R44            2

SC DI TH UN_ FP_I COUNT(FP_ID)
-- -- -- --- ---- ------------
14 61 02 013 5J85            2
14 64 02 010 5J85            2
14 64 02 001 5J85            2
14 61 02 077 5J85            2
14 61 07 033 5D51            2
14 61 01 033 5R44            2
14 61 01 068 5R44            2
14 61 01 073 5R44            2

92 rows selected.



  select *
 from
  (
    SELECT SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID,
       row_number() over(partition BY SC_CD, DIST_CD, THA_CD, UN_CD, FP_ID order by FP_ID) rn
    FROM tmp_emp_area
  ) dt
 WHERE rn >1
SQL> /


SC DI TH UN_ FP_I        RN
-- -- -- --- ---- ---------
14 60 13 077 5F77         2
14 60 13 078 5F77         2
14 60 19 014 5F77         2
14 60 19 059 5F77         2
14 60 19 060 5F77         2
14 60 19 132 5F77         2
14 60 19 134 5F77         2
14 61 01 015 5R44         2
14 61 01 017 5R44         2
14 61 01 018 5R44         2
14 61 01 020 5R44         2
14 61 01 021 5R44         2
14 61 01 024 5R44         2
14 61 01 029 5R44         2
14 61 01 031 5R44         2
14 61 01 033 5R44         2
14 61 01 036 5R44         2
14 61 01 041 5R44         2
14 61 01 053 5R44         2
14 61 01 054 5R44         2
14 61 01 055 5R44         2

SC DI TH UN_ FP_I        RN
-- -- -- --- ---- ---------
14 61 01 056 5R44         2
14 61 01 057 5R44         2
14 61 01 065 5R44         2
14 61 01 066 5R44         2
14 61 01 067 5R44         2
14 61 01 068 5R44         2
14 61 01 069 5R44         2
14 61 01 073 5R44         2
14 61 01 075 5R44         2
14 61 01 076 5R44         2
14 61 01 077 5R44         2
14 61 01 078 5R44         2
14 61 02 009 5J85         2
14 61 02 010 5J85         2
14 61 02 013 5J85         2
14 61 02 014 5J85         2
14 61 02 017 5J85         2
14 61 02 022 5J85         2
14 61 02 033 5J85         2
14 61 02 059 5R44         2
14 61 02 074 5J85         2

SC DI TH UN_ FP_I        RN
-- -- -- --- ---- ---------
14 61 02 074 5J85         3
14 61 02 077 5J85         2
14 61 02 080 5J85         2
14 61 02 081 5J85         2
14 61 02 082 5J85         2
14 61 02 088 5J85         2
14 61 02 089 5J85         2
14 61 02 092 5J85         2
14 61 02 092 5J85         3
14 61 02 093 5J85         2
14 61 02 093 5J85         3
14 61 02 097 5J85         2
14 61 02 098 5J85         2
14 61 02 098 5J85         3
14 61 02 103 5J85         2
14 61 02 105 5J85         2
14 61 02 109 5J85         2
14 61 02 151 5J85         2
14 61 05 001 5R44         2
14 61 05 003 5R44         2
14 61 05 007 5R44         2

SC DI TH UN_ FP_I        RN
-- -- -- --- ---- ---------
14 61 05 046 5R44         2
14 61 05 047 5R44         2
14 61 05 053 5D51         2
14 61 06 006 5D51         2
14 61 06 007 5D51         2
14 61 06 008 5D51         2
14 61 06 010 5D51         2
14 61 06 014 5D51         2
14 61 06 016 5D51         2
14 61 06 020 5D51         2
14 61 06 035 5D51         2
14 61 06 036 5D51         2
14 61 06 045 5D51         2
14 61 07 013 5D51         2
14 61 07 015 5D51         2
14 61 07 033 5D51         2
14 61 07 083 5D51         2
14 61 07 086 5D51         2
14 61 07 087 5D51         2
14 61 08 027 5R44         2
14 61 09 002 5J85         2

SC DI TH UN_ FP_I        RN
-- -- -- --- ---- ---------
14 64 02 001 5J85         2
14 64 02 002 5J85         2
14 64 02 003 5J85         2
14 64 02 004 5J85         2
14 64 02 006 5J85         2
14 64 02 008 5J85         2
14 64 02 010 5J85         2
14 64 02 011 5J85         2
14 64 02 020 5J85         2
14 64 02 030 5J85         2
14 64 03 013 5J85         2
14 64 03 020 5J85         2

96 rows selected.

1 个答案:

答案 0 :(得分:2)

您不能在WHERE中使用别名,请切换到派生表:

select *
from
 (
   SELECT SC_CD,DIST_CD,THA_CD,UN_CD,FP_ID,
      row_number() over(partition BY SC_CD, DIST_CD, THA_CD, UN_CD, FP_ID order by FP_ID) rn
   FROM tmp_emp_area
 ) dt
WHERE rn >1