簡體   English   中英

Oracle查詢以查找記錄,如果計數> = 2並且列中唯一

[英]Oracle Query to Find Records If Count >= 2 and unique in column

+----------+---------+------------+-----------+
| MEMRECNO | RECSTAT | IDSRCRECNO | IDNUMBER  |
+----------+---------+------------+-----------+
|   556787 | D       |          5 | 956645789 |
|   123456 | A       |          5 | 956645789 |
|   546578 | A       |          5 | 462454322 |
|   262441 | A       |          4 | 462454322 |
|   657855 | D       |          3 | 462454322 |
|   746877 | A       |          5 | 654988844 |
|   989455 | A       |          2 | 654988844 |
|   444863 | A       |          1 | 654988844 |
+----------+---------+------------+-----------+

我正在嘗試編寫查詢以選擇兩個或多個源(IDSRCRECNO)具有相同IDNUMBER的記錄。 我已經按照以下方式開始了查詢:

在哪里idnumber IN(通過idnumber從表GROUP中選擇idnumber HAVING count(idnumber)> = 2

Expected Results: 

結果中包含MEMRECNO 546578和262441。 這是因為兩個記錄均處於活動狀態,IDNUMBER相同,而IDSRCRECNO不同。

不會包括MEMRECNO 556787和123456,因為即使IDNUMBERS匹配,記錄/記錄之一也會被刪除(D)。

不會包括Memrecno 262441和657855,因為即使IDNUMBERS匹配和IDSRCRECNO不同,記錄/記錄之一也會被刪除(D)。

不會包括Memrecno 262441和657855,因為即使IDNUMBERS匹配和IDSRCRECNO不同,記錄/記錄之一也會被刪除(D)。

包括Memrecno 746877、989455、444863,因為所有三個記錄均處於活動狀態,IDSRCRECNO不同且IDNUMBER匹配。

提前致謝!

那是你要找的東西嗎

我剛剛在您的內部查詢中添加了WHERE子句:

SELECT idnumber 
WHERE recstat <> 'D' 
FROM table GROUP by idnumber 
HAVING count(idnumber) >= 2

我會這樣做:

with data as (
    select 556787 memrecno, 'D' recstat, 5 idsrcrecno, 956645789 idnumber from dual union all
    select 123456 memrecno, 'A' recstat, 5 idsrcrecno, 956645789 idnumber from dual union all
    select 546578 memrecno, 'A' recstat, 5 idsrcrecno, 462454322 idnumber from dual union all
    select 262441 memrecno, 'A' recstat, 4 idsrcrecno, 462454322 idnumber from dual union all
    select 657855 memrecno, 'D' recstat, 3 idsrcrecno, 462454322 idnumber from dual union all
    select 746877 memrecno, 'A' recstat, 5 idsrcrecno, 654988844 idnumber from dual union all
    select 989455 memrecno, 'A' recstat, 2 idsrcrecno, 654988844 idnumber from dual union all
    select 444863 memrecno, 'A' recstat, 1 idsrcrecno, 654988844 idnumber from dual
)
select *
from (
    select memrecno, recstat, idsrcrecno, idnumber, count(distinct idsrcrecno) over (partition by idnumber) rec_cnt
    from data
    where recstat = 'A'
)
where rec_cnt > 1;

哪個返回:

  MEMRECNO RECSTAT IDSRCRECNO   IDNUMBER    REC_CNT
---------- ------- ---------- ---------- ----------
    262441 A                4  462454322          2
    546578 A                5  462454322          2
    444863 A                1  654988844          3
    989455 A                2  654988844          3
    746877 A                5  654988844          3

假設您只想查看活動記錄。 例如,如果MEMRECNO = 444863未處於活動狀態,則必須更改查詢,但您仍希望顯示該查詢(因為仍然會有2條記錄具有相同的IDNUMBER和不同的IDSRCRECNO)。 如果您正在尋找評論,請發表評論,我將對此進行相應的更新。

您也可以不使用排序來實現此目的,而使用查詢可能會對大量數據使用哈希半聯接:

select *
from   my_table t1
where  recstat = 'A' and
       exists (
         select null
         from   my_table t2
         where  t2.IDNUMBER =  t1.IDNUMBER and
                t2.MEMRECNO != t1.MEMRECNO and
                t2.RECSTAT  =  'A')

我認為您的WHERE子句應為

WHERE idnumber in ( SELECT idnumber 
                    FROM ( SELECT count(*), idnumber 
                           FROM  table 
                           GROUP by idnumber 
                           HAVING count(*) >= 2
                         ) temp
                  )  

暫無
暫無

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

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