【问题标题】:Oracle filter groups that contains more than one row condition包含多个行条件的 Oracle 过滤器组
【发布时间】:2022-11-17 21:24:44
【问题描述】:

我需要一个针对 Oracle 的 SQL 查询,它选择包含元素“ABC”和“ANQ”的组

group X   Column Q
--------   ---------
123        ABC
123        AAA    
123        ANQ
456        ANQ
456        PKR
579        AAA
579        XYZ
886        ABC

期望的结果应该是

 group X   Column Q
    --------   ---------
    123        ABC
    123        AAA    
    123        ANQ

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以使用具有条件聚合的分析COUNT 函数仅查询一次表:

    SELECT x,
           q
    FROM   (
      SELECT x,
             q,
             COUNT(CASE q WHEN 'ABC' THEN 1 END) OVER (PARTITION BY x) AS num_abc,
             COUNT(CASE q WHEN 'ANQ' THEN 1 END) OVER (PARTITION BY x) AS num_anq
      FROM   table_name
    )
    WHERE  num_abc > 0
    AND    num_anq > 0;
    

    其中,对于样本数据:

    CREATE TABLE table_name (X, Q) AS
    SELECT 123, 'ABC' FROM DUAL UNION ALL
    SELECT 123, 'AAA' FROM DUAL UNION ALL
    SELECT 123, 'ANQ' FROM DUAL UNION ALL
    SELECT 456, 'ANQ' FROM DUAL UNION ALL
    SELECT 456, 'PKR' FROM DUAL UNION ALL
    SELECT 579, 'AAA' FROM DUAL UNION ALL
    SELECT 579, 'XYZ' FROM DUAL UNION ALL
    SELECT 886, 'ABC' FROM DUAL;
    

    输出:

    X Q
    123 ABC
    123 AAA
    123 ANQ

    fiddle

    【讨论】:

      【解决方案2】:

      例如:

      样本数据:

      SQL> with test (x, q) as
        2    (select 123, 'abc' from dual union all
        3     select 123, 'aaa' from dual union all
        4     select 123, 'anq' from dual union all
        5     select 456, 'anq' from dual union all
        6     select 456, 'pkr' from dual union all
        7     select 579, 'aaa' from dual union all
        8     select 579, 'xyz' from dual union all
        9     select 886, 'abc' from dual
       10    )
      

      询问:

       11  select x, q
       12  from test a
       13  where exists (select null
       14                from test b
       15                where b.q in ('abc', 'anq')
       16                  and b.x = a.x
       17                group by b.x
       18                having count(distinct b.q) = 2
       19               );
      
               X Q
      ---------- ---
             123 abc
             123 aaa
             123 anq
      
      SQL>
      

      【讨论】:

        猜你喜欢
        • 2017-05-06
        • 1970-01-01
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 2021-01-27
        • 2017-08-03
        • 1970-01-01
        相关资源
        最近更新 更多