【问题标题】:Oracle SQL Include a column to display without adding it in GROUP BYOracle SQL 包含要显示的列而不将其添加到 GROUP BY
【发布时间】:2015-02-12 17:54:03
【问题描述】:

我正在尝试在用户表上查找所有案例变体重复项:

SELECT LOWER(EMAIL), COUNT(EMAIL) 
    FROM USERS
    GROUP BY LOWER(EMAIL)
    HAVING COUNT (LOWER(EMAIL)) >= 3;

结果类似于:

Emails                   Count (number of duplicates)
bob@example.com          3   
john.smith@example.com   3 
blah@example.com         4 
james.smith@example.com  3 

问题是我需要每封电子邮件的 ID,我该如何实现?由于 GROUP BY,我不能简单地将其添加到 SELECT 语句中:

SELECT **ID**, LOWER(EMAIL), COUNT(EMAIL) 
    FROM USERS
    GROUP BY **ID**, LOWER(EMAIL)
    HAVING COUNT (LOWER(EMAIL)) >= 3;

上面会寻找重复的电子邮件 ID,这不是我需要的。

【问题讨论】:

    标签: sql oracle11g group-by case-insensitive


    【解决方案1】:

    您可以使用analytic count() 在内联视图中:

    SELECT ID, EMAIL, LOWER(EMAIL), HOW_MANY
    FROM (
      SELECT ID, EMAIL, COUNT(*) OVER (PARTITION BY LOWER(EMAIL)) AS HOW_MANY
      FROM USERS
    )
    WHERE HOW_MANY >= 3
    ORDER BY ID;
    
            ID EMAIL                          LOWER(EMAIL)                     HOW_MANY
    ---------- ------------------------------ ------------------------------ ----------
             1 bob@example.com                bob@example.com                         3 
             2 Bob@example.com                bob@example.com                         3 
             3 BOB@example.com                bob@example.com                         3 
             4 john.smith@example.com         john.smith@example.com                  3 
             5 John.smith@example.com         john.smith@example.com                  3 
             6 JOHN.smith@example.com         john.smith@example.com                  3 
             7 blah@example.com               blah@example.com                        4 
             8 BLAH@example.com               blah@example.com                        4 
             9 blAH@example.com               blah@example.com                        4 
            10 BLah@example.com               blah@example.com                        4 
            11 james.smith@example.com        james.smith@example.com                 3 
            12 James.smith@example.com        james.smith@example.com                 3 
            13 JAMES.smith@example.com        james.smith@example.com                 3 
    

    SQL Fiddle。分析的好处之一是它只需要提交一次。

    【讨论】:

    • 哦,很酷,我以前从未听说过这个(我是这方面的新手)。请花点时间尝试一下。
    • 非常感谢,这是最好的答案。这也很快:)。在大数据上运行良好。您的 SQL Fiddle 也很有帮助。感谢您的帮助!
    【解决方案2】:

    试试这个:

    SELECT U.*, COUNT(LOWER(EMAIL)) OVER (PARTITION BY (LOWER(EMAIL))) 
        FROM USERS U WHERE LOWER(EMAIL) IN (SELECT LOWER(EMAIL)
        FROM USERS
        GROUP BY LOWER(EMAIL)
        HAVING COUNT (LOWER(EMAIL)) >= 3);
    

    【讨论】:

    • 我尝试过类似的查询,但问题是,我无法显示 COUNT(EMAIL)。
    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多