2016-01-28 16 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

相关问题