Как написать запрос в ORACLE и SQL_SERVER, чтобы получить записи с наибольшим количеством статусов? - PullRequest
2 голосов
/ 30 марта 2012

для таблицы ниже

tenant_id | status_id
----------------------
   3      |   6
---------------------
   5      |   7
---------------------
   7      |   7
--------------------
   3      |   7
-------------------
   3      |   7
--------------------
   5      |   7

мы можем видеть, что:

  • tenant_id = 3 имеет 1 запись с status_id = 6
  • tenant_id = 5 имеет 2 записи с status_id = 7
  • tenant_id = 7 имеет 1 запись с status_id = 7
  • tenant_id = 3 имеет 2 записи с status_id = 7

Для данного STATUS_ID_PARAM я хочу получить всех арендаторов, у которых больше всего записей с STATUS_ID_PARAM. Для примера выше, для STATUS_ID_PARAM = 7 запрос должен вернуть 2 записи:

   tenant_id | status_id
   --------------------
      3      |   7
   --------------------
      5      |   7

потому что у этих арендаторов больше всего записей (по 2 на каждого) с status_id = 7.

Я пробовал что-то подобное, но я не знаю, как продолжить, или, может быть, есть другой способ:

select tenant_id, count(status_id) s
from candidate
where status_id = STATUS_ID_PARAM 
group by tenant_id, status_id

Ответы [ 4 ]

4 голосов
/ 30 марта 2012

Это будет работать как в Oracle, так и в SQL Server

select tenant_id, s
from
  (       
    select tenant_id,
           count(*) as s,
           rank() over(order by count(*) desc) as rn
    from candidate
    where status_id = 7
    group by tenant_id
  ) T
where rn = 1;

(протестировано на SQL Server 2005-> 2012 и Oracle 11g R2)

0 голосов
/ 30 марта 2012

Я отредактировал ответ:)

select tenant_id, count(status_id) s
from candidate can
where status_id = 7
group by tenant_id, status_id
having COUNT(status_id) 
in 
(
select top 1 count(status_id) from candidate 
group by status_id,tenant_id
order by COUNT(status_id) desc
)
0 голосов
/ 30 марта 2012

Попробуйте

select tenant_id, count(status_id) s
from candidate
where status_id = STATUS_ID_PARAM 
AND count(status_id) = MAX(count(status_id))
group by tenant_id, status_id
0 голосов
/ 30 марта 2012
select tenant_id, count(status_id) s
from candidate
where status_id = STATUS_ID_PARAM 
group by tenant_id, status_id
having count(status_id) = (select max(count(status_id)) from candidate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...