[英]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.