【问题标题】:Subquery based on max number of related rows基于最大相关行数的子查询
【发布时间】:2015-01-17 15:07:45
【问题描述】:

我正在使用 Oracle 11g R2。

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

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

检查sn-p“预期结果”。

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 和 SUB_B6。

【问题讨论】:

  • 错误告诉你问题出在哪里。对于AAABBBGPRS CTE 中有不止一行。在correlated subquery 中使用Top 1 或修复其中的where 子句
  • 请注意“预期结果”部分和我的解释,我需要根据 SUBGRP 列的最大出现次数从子查询中获取数据。
  • 非常感谢,但这不是我想要的.....我不是根据它们的降序来寻找 SUB_A2 和 SUB_B6 值......但因为它们是重复次数最多的值。我的意思是,我会先计算它们,然后检查哪个具有更多的计数值。

标签: sql oracle oracle11g


【解决方案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

【讨论】:

  • 谢谢!!这就像一个魅力!......只是好奇是否有任何其他不涉及分析函数的解决方案?我记得有一次在 SQL Server 中解决了这个问题...(找不到代码),它涉及使用 MAX、附加子查询或我不记得的自联接...
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2019-05-28
  • 1970-01-01
  • 2020-08-07
相关资源
最近更新 更多