Нахождение множественного вхождения - PullRequest
2 голосов
/ 07 января 2020

Вот таблица:

account no.  cust_id    Month  Installment  Status
5212340001   1002        30    15000         Closed
5212340002   1002        66    25000         Active
5212340003   1007        36    80555         Closed
5212340004   1003        60    30000         Active

Я хочу найти максимальное вхождение cust_id с несколькими учетными записями. Вот мой код:

SELECT CUST_ID,COUNT(CUST_ID) AS C
FROM BANK_FD_ACCOUNT
GROUP BY CUST_ID
HAVING C=MAX(C);

Я получаю ошибку. Однако ожидаемый результат должен быть таким:

cust_id    c
1002       2

Ответы [ 3 ]

2 голосов
/ 08 января 2020

В MySQL (так как вопрос был изначально помечен), вы можете использовать ORDER BY и LIMIT для возврата одной строки:

SELECT CUST_ID, COUNT(CUST_ID) AS C
FROM BANK_FD_ACCOUNT
GROUP BY CUST_ID
ORDER BY C DESC
LIMIT 1;

В случае дубликатов это вернет произвольный клиент. Если вы хотите все из них, используйте RANK():

SELECT c.*
FROM (SELECT CUST_ID, COUNT(*) AS C,
             RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM BANK_FD_ACCOUNT
      GROUP BY CUST_ID
     ) c
WHERE seqnum = 1;

. Вы можете использовать ROW_NUMBER(), чтобы вернуть одну строку (аналогично LIMIT в примере MySQL).

1 голос
/ 08 января 2020

В oracle 12 c и выше вы можете использовать условие ограничения строки , а также обрабатывать дублирующийся максимум следующим образом:

SELECT CUST_ID, 
       COUNT(CUST_ID) AS CNT
  FROM BANK_FD_ACCOUNT
GROUP BY CUST_ID
ORDER BY CNT DESC
FETCH FIRST RIW WITH TIES;

Здесь, WITH TIES будет дать вам кратное cust_id, если у них одинаковое количество (максимальное).

1 голос
/ 08 января 2020

@ GAURAV Шарма Вам не нужно использовать HAVING, просто используйте оператор ORDER BY и LIMIT 1:

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ: так как исходный вопрос указывал на MySQL, это то, что этот ответ применим к.

SELECT CUST_ID,
    COUNT(CUST_ID) AS C
FROM BANK_FD_ACCOUNT
GROUP BY CUST_ID
ORDER BY c DESC 
LIMIT 1;
...