2017-01-27 27 views
0

このシナリオの問合せを手伝ってもらえますか。以下のケースでは、列Aの13,14が最も出現し、B(30)の値が13より大きいので、A = 13の単一行を返します。私たちはAの最大発生に関心があります。タイ・ブレーカーとみなす。私たちは法人顧客からのコールを取得する - それはB.11g Oracle集約SQL問合せ

A B 
13 30 
14 40 
15 5 

ユースケースのための40の14た最大値を返す必要がありますが1回発生(すべてが結ば)があり、以下の場合には

A B 
13 30 
13 12 
14 10 
14 25 
15 5 

。私たちは、ほとんどの通話が来て何時間になっているか知っていることに興味があります。

次の質問

さらに質問があります。 @GurVの '11g or lower'と@mathguyの 'dense_rank'の2つのソリューションのどちらかを使いたいのですが、どのようにすればいいのですか?

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) 
+0

14の場合、合計は35で40ではなくなります。これらをA列とB値の合計でグループ化するのですか? – Saif

+0

@Smartの出力は期待されていません。それは入力の2番目のケースです – GurV

+0

@smartありがとう。それはBの合計とは関係ありません。Bは通話時間(分)です。 –

答えて

2

12C +

select a 
from t 
group by a 
order by count(*) desc, max(b) desc 
fetch first 1 row only; 

場合は11グラム以下とした場合、これを試してみてください:

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

注その後、Aの2つ以上の値について等しい数と等しい最大値がある場合は、そのいずれか1つが取り出されます。

+0

私はsum(b)よりmax(b)に興味があります –

+0

@サミー。 。 。更新しました。 – GurV

+0

ありがとう@Gurv。これは最高の答えです。すべて今働いている。 –

0

古いバージョン(fetch句なし)で動作し、サブクエリを必要としないクエリです。それはfirst/last機能を使用します。 Aと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 
;