11g Oracle聚合SQL查询

11g Oracle聚合SQL查询,oracle,oracle11g,aggregate-functions,Oracle,Oracle11g,Aggregate Functions,你能帮我查询一下这个场景吗。在下面的情况下,它应该返回A=13的单行,因为A列中的13,14出现次数最多,而B(30)的值对于13来说更大。我们感兴趣的是A的最大出现次数,如果是领带B,则应将其视为领带断路器 A B 13 30 13 12 14 10 14 25 15 5 在下面的情况下,如果出现一次A(全部并列),则应返回14,B的最大值为40 A B 13 30 14 40 15 5 用例-我们接到公司客户的电话。我们感兴趣的是知道在一天中什么时候有最多的电话,

你能帮我查询一下这个场景吗。在下面的情况下,它应该返回A=13的单行,因为A列中的13,14出现次数最多,而B(30)的值对于13来说更大。我们感兴趣的是A的最大出现次数,如果是领带B,则应将其视为领带断路器

A   B
13  30
13  12
14  10
14  25
15  5
在下面的情况下,如果出现一次A(全部并列),则应返回14,B的最大值为40

A   B
13  30
14  40
15  5
用例-我们接到公司客户的电话。我们感兴趣的是知道在一天中什么时候有最多的电话,如果是平局,最忙的时间中哪一个有最长的电话

进一步问题

在这方面还有更多的问题。我想使用两种解决方案中的任何一种——来自@GurV的“11g或更低”或来自@mathguy的“稠密等级”,在下面的更大的查询中,我该如何做

    SELECT dv.id , u.email , dv.email_subject AS headline , dv.start_date , dv.closing_date, b.name AS business_name, ls.call_cost, dv.currency,
    SUM(lsc.duration) AS duration,  COUNT(lsc.id) AS call_count, ROUND(AVG(lsc.duration), 2) AS avg_duration 
    -- max(extract(HOUR from started )) keep (dense_rank last order by count(duration), max(duration)) as most_popular_hour
    FROM deal_voucher dv
        JOIN lead_source ls ON dv.id = ls.deal_id
        JOIN lead_source_call lsc ON ls.PHONE_SID = lsc.phone_number_id
        JOIN business b ON dv.business_id = b.id
        JOIN users u ON b.id = u.business_id
        AND TRUNC(dv.closing_date) = to_date('13-01-2017', 'dd-mm-yyyy')
        AND lsc.status = 'completed' and lsc.duration >= 30
    GROUP BY dv.id , u.email , dv.email_subject , dv.start_date , dv.closing_date, b.name, ls.call_cost, dv.currency
--, extract(HOUR from started )
如果12c,试试这个+

select a
from t
group by a
order by count(*) desc, max(b) desc
fetch first 1 row only;
如果11g或更低:

select * from (
    select a
    from t
    group by a
    order by count(*) desc, max(b) desc
) where rownum = 1;
请注意,如果A的两个或多个值的计数和最大值相等,则将提取其中任何一个值。

如果12c,请尝试此操作+

select a
from t
group by a
order by count(*) desc, max(b) desc
fetch first 1 row only;
如果11g或更低:

select * from (
    select a
    from t
    group by a
    order by count(*) desc, max(b) desc
) where rownum = 1;

请注意,如果A的两个或多个值具有相等的count和相等的max value,则将获取其中任何一个值。

这里的查询将在旧版本中工作(no
fetch
子句),并且不需要子查询。它使用
first/last
功能。如果同时通过“按A计数”和“最大值(B)”进行连接,则仅选择A值最大的行。您可以将其更改为
min(A)
,甚至更改为
sum(A)
(尽管这在您的问题中可能没有意义)或组内的
listag(A),,”(按A排序)
获取以逗号分隔的a列表,该列表并列第一,但需要11.2(我相信)


这是一个查询,它将在旧版本(no
fetch
子句)中工作,并且不需要子查询。它使用
first/last
功能。如果同时通过“按A计数”和“最大值(B)”进行连接,则仅选择A值最大的行。您可以将其更改为
min(A)
,甚至更改为
sum(A)
(尽管这在您的问题中可能没有意义)或组内的
listag(A),,”(按A排序)
获取以逗号分隔的a列表,该列表并列第一,但需要11.2(我相信)


如果是14,那么总数将是35,而不是40!你的意思是用一列和B值之和来分组吗?@Smart这不是预期的输出,这是第二种情况input@smart谢谢这与B的总和无关。B是以分钟为单位的呼叫持续时间。如果两个条件都有联系,您需要返回什么?与第二个示例一样,A中没有重复项,但B中的所有值都相同(假设为30)?另外,由于不同版本中有不同的工具,您有什么版本的Oracle?实际上,不要介意最后一个问题,我在标题中看到11g,它也应该在标签中。我马上为您编辑标签。@mathguy谢谢。我想这不会是个问题。为了简单起见,我在这里将B列作为调用持续时间,单位为分钟,但实际上是秒。很少有呼叫持续时间(以秒为单位)是相同的。如果是14,那么总数将是35,而不是40!你的意思是用一列和B值之和来分组吗?@Smart这不是预期的输出,这是第二种情况input@smart谢谢这与B的总和无关。B是以分钟为单位的呼叫持续时间。如果两个条件都有联系,您需要返回什么?与第二个示例一样,A中没有重复项,但B中的所有值都相同(假设为30)?另外,由于不同版本中有不同的工具,您有什么版本的Oracle?实际上,不要介意最后一个问题,我在标题中看到11g,它也应该在标签中。我马上为您编辑标签。@mathguy谢谢。我想这不会是个问题。为了简单起见,我在这里将B列作为调用持续时间,单位为分钟,但实际上是秒。很少有以秒为单位的呼叫持续时间相同。@Sammy。更新。非常感谢@Gurv。这是最好的答案。现在都在工作了。@Sammy。更新。非常感谢@Gurv。这是最好的答案。现在都在工作。