2016-01-28 13 views
0

我有一個表在Oracle數據庫中,看起來是這樣的:在Oracle中,得到一個場基地的獨特出現的次數上的另一場

ID1  ID2 
1  4 
1  4 
2  3 
1  5 
2  5 
3  6 

從本質上講,我想編寫一個查詢,這將使計數ID1和ID2的數量,其中ID2對於ID1是唯一的。另外,在上述我的例子中,查詢將返回:

ID1  countOfUniqueID2Pairs 
1     1 
2     1 
3     1 

這將是的結果,因爲每個ID1只有一個ID2所獨有的它(1至4,2至3,3至6)。

有人會知道如何去寫這個查詢嗎?

回答

2

甲骨文設置

CREATE TABLE TABLE_NAME (ID1, ID2) AS (
    SELECT 1, 4 FROM DUAL UNION ALL 
    SELECT 1, 4 FROM DUAL UNION ALL 
    SELECT 2, 3 FROM DUAL UNION ALL 
    SELECT 1, 5 FROM DUAL UNION ALL 
    SELECT 2, 5 FROM DUAL UNION ALL 
    SELECT 3, 6 FROM DUAL 
); 

查詢

SELECT ID1, 
     COUNT(DISTINCT ID2) 
FROM TABLE_NAME 
WHERE ID2 IN (SELECT ID2 
       FROM TABLE_NAME 
       GROUP BY ID2 
       HAVING COUNT(DISTINCT ID1) = 1) 
GROUP BY ID1; 

結果

 ID1 COUNT(DISTINCTID2) 
---------- ------------------ 
     1     1 
     2     1 
     3     1 

更新 - 查詢2

SELECT ID1, 
     COUNT(DISTINCT ID2) 
FROM (
    SELECT ID1, 
     ID2, 
     COUNT(DISTINCT ID1) OVER (PARTITION BY ID2) AS CNT1 
    FROM Table_Name 
) 
WHERE CNT1 = 1 
GROUP BY ID1; 
+0

這看起來是正確的查詢,但在那裏,這將是另一種速度更快的方法?我正在運行這個表格非常大(數十億條記錄)。 – user2276280

+0

添加了第二個查詢,該查詢不會對錶進行兩次完整掃描(而是使用單個表掃描和解析函數)。 – MT0

+0

快得多!謝謝! – user2276280

0

同樣的結果使用ID2爲支點:

SELECT t2.id1 
    , count(distinct t.id1) "countOfUniqueID2Pairs" 
    FROM table_name t 
    INNER JOIN table_name t2 
     ON t2.id2 = t.id2 
    GROUP BY t.id2, t2.id1 
    HAVING count(distinct t.id1) = 1 
+0

嘗試在數據中添加一行'id1 = 3,id2 = 7'。預期的結果是'id1 = 3'的計數爲'2',但是這個查詢將得到兩行,其中'id1 = 3'每個計數爲'1'。 – MT0

相關問題