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

时间:2015-01-17 06:04:11

标签: sql oracle oracle11g

我使用的是Oracle 11g R2。

我想从具有多个子行的表中返回单个值。 子查询必须根据第二个不相关列的最大值返回值。

以下代码以CTE的形式提供数据...并且尝试创建语句失败。 我知道我必须以某种方式区分这些值,以便它返回具有最大子数的那个。

检查摘录"预期结果"。



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

)
;




这当然不会起作用,并且会给我一个错误,例如"单行子查询返回多行"。 我没有'需要从相关子查询中获取任何行。我需要从该表中获取更多重复的值。在这种情况下,SUB_A2,AND SUB_B6。

1 个答案:

答案 0 :(得分:1)

使用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