[英]11g Oracle aggregate SQL query
您能否幫我查詢這種情況。 在以下情況下,它應該返回我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的'dense_rank'在下面的較大查詢中我該怎么做。
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的值相等且最大值相等,則將提取其中任何一個。
這是一個將在較舊版本中運行的查詢(無fetch
子句),並且不需要子查詢。 它使用第first/last
功能。 如果同時使用“ count by A”和“ max(B)的值”進行平局,則它僅選擇具有最大A值的行。您可以將其更改為min(A)
,甚至改為sum(A)
(盡管這在您的問題中可能沒有任何意義)或LISTAGG(A, ',') WITHIN GROUP (ORDER BY A)
以逗號分隔的第一位A列表,但這需要11.2(我相信)。
select max(a) keep (dense_rank last order by count(b), max(b)) as a
, max(max(b)) keep (dense_rank last order by count(b)) as b
from inputs
group by a
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.