基于最大相关行数的子查询

Subquery based on max number of related rows

我正在使用 Oracle 11g R2。

我想 return 来自具有多个子行的 table 的单个值。 子查询必须 return 基于第二个不相关列的最大值数的值。

以下代码以 CTE 的形式提供数据...以及创建语句的失败尝试。 我知道我必须以某种方式区分这些值,以便它 return 是拥有最大子数量的值。

检查片段 "Expected result"。

WITH GRPS(GRP, SUBGRP)
AS
(
    SELECT 'AAA', 'SUB_A1' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A3' FROM DUAL UNION ALL
    SELECT 'BBB', 'SUB_B5' FROM DUAL UNION ALL
    SELECT 'BBB', 'SUB_B6' FROM DUAL UNION ALL
    SELECT 'BBB', 'SUB_B6' FROM DUAL UNION ALL 
    SELECT 'BBB', 'SUB_B7' FROM DUAL 
),
TAB1 (GRP)
AS
(
   SELECT 'AAA' FROM DUAL UNION ALL
   SELECT 'BBB' FROM DUAL 
)

(


SELECT 
    TAB1.GRP,
    GRPS.SUBGRP, 
    COUNT(*)
FROM TAB1
JOIN GRPS 
    ON (GRPS.GRP = TAB1.GRP)
GROUP BY TAB1.GRP,
GRPS.SUBGRP 

-- That will get me these:
-- Row# GRP SUBGRP COUNT(*)
-- 1 BBB SUB_B5 1
-- 2 AAA SUB_A2 3
-- 3 AAA SUB_A1 1
-- 4 BBB SUB_B6 2
-- From which I still have to perform a search to get me the rows with SUB_B6 AND SUB_A2


-- Expected result
-- AAA SUB_A2
-- BBB SUB_B6

)
;

这当然不会起作用,并且会给我一个像 "single-row subquery returns more than one row" 这样的错误。 我不需要从相关子查询中获取任何行。我需要从 table 中获取重复次数更多的值。在这种情况下 SUB_A2,并且 SUB_B6。

使用Analytic Function。试试这个

WITH GRPS(GRP, SUBGRP)
AS
(
    SELECT 'AAA', 'SUB_A1' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
    SELECT 'AAA', 'SUB_A2' FROM DUAL UNION ALL
    SELECT 'BBB', 'SUB_B5' FROM DUAL UNION ALL
    SELECT 'BBB', 'SUB_B6' FROM DUAL UNION ALL
    SELECT 'BBB', 'SUB_B6' FROM DUAL 
),
TAB1 (GRP)
AS
(
   SELECT 'AAA' FROM DUAL UNION ALL
   SELECT 'BBB' FROM DUAL 
)

(

select grp,subgrp from(
SELECT 
    TAB1.GRP,
    GRPS.SUBGRP, 
    row_number() over(partition by TAB1.GRP order by  count(1) desc) rn
FROM TAB1
JOIN GRPS 
    ON (GRPS.GRP = TAB1.GRP)
  group by TAB1.GRP,
    GRPS.SUBGRP
) a where rn=1
)
;

FIDDLE DEMO