SQL Как добавить несколько атрибутов для группировки по функциям - PullRequest
0 голосов
/ 09 мая 2019

Я использую Oracle SQL и хочу написать запрос, который будет отображать сведения о клиенте (ах), которые ссылаются на максимальное количество клиентов. Может быть более одного клиента (если максимальное количество рефералов для каждого клиента равно).

В таблице CUSTOMER, содержащей CUS_ID, CUS_NAME, CUS_REFERRED, я могу получить CUS_REFERRED и COUNT(CUST_REFERRED), используя:

   select  CUST_REFERRED, count(CUST_REFERRED)
   from CUSTOMER 
   group by CUST_REFERRED
   having count(CUST_REFERRED) = (select max(MYCOUNT) 
   from (select cust_referred, 
           count(CUST_REFERRED) MYCOUNT 
           from CUSTOMER 
           group by CUST_REFERRED));

Пример данных:

Cust_Num        Cust_FName         Cust_Referred
------------------------------------------------
1000            Patricia           (null)
1001            Jim                1000
1002            Zoe                1003
1003            John               (null)
1004            Marie              1003
1005            Anthony            1002
1006            Jodee              1003                

Токовый выход:

CUST_REFERRED   COUNT(C.CUST_REFERRED) 
-------------   ---------------------- 
1003            3

Желаемый выход:

CUST_FNAME  CUST_REFERRED   COUNT(C.CUST_REFERRED) 
----------  -------------   ---------------------- 
John        1003            3

Где Джон является клиентом 1003 и имеет наибольшее количество рефералов (3). Если другой человек (скажем, Джек) также сделал 3 рефералов, он также был бы в списке.

Однако всякий раз, когда я пытаюсь добавить CUS_FNAME - я получаю 'не возвращено ни одной строки' (если это основной запрос на выборку) или список клиентов с 1 рефералом (во вложенном запросе на выборку).

Любая помощь высоко ценится!

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Использовать оконные функции:

select cust_referred, cnt
from (select cust_referred, count(*) as cnt,
             rank() over (order by count(*)) as seqnum
      from customer
      group by cust_referred
     ) c
where seqnum = 1;

Если вам нужна дополнительная информация о клиенте, вы можете присоединить ее обратно к таблице customer.

0 голосов
/ 09 мая 2019

Начиная с Oracle 12c:

select c.cust_num, c.cust_fname, cr.cnt
from customer c
join
(
  select cust_referred, count(*) as cnt
  from customer
  group by cust_referred
  order by count(*) desc
  fetch first row with ties
) cr on cr.cust_referred = c.cust_num;

В старых версиях:

select c.cust_num, c.cust_fname, cr.cnt
from customer c
join
(
  select
    cust_referred,
    count(*) as cnt,
    rank() over (order by count(*) desc) as rnk
  from customer
  group by cust_referred
) cr on cr.cust_referred = c.cust_num and cr.rnk = 1;

Демонстрация: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=aa5875f649943cacaa3e03b86ebe3cf4

...