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

select distinct 
npa,--,nxx
state, country, time_zone, count(*)  
from npanxx 
where time_zone is not null and time_zone <> '0' --and npa = '270' 
group by npa
--, nxx
, state, country, time_zone
order by npa

Этот запрос позволил мне увидеть, у какого npa наибольшее количество столбцов, и на основании этого я хочу выбрать max (count (*)), но это не сработало. Я что-то пробовала

select distinct 
npa,--,nxx
state, country, time_zone, count(*)  
from npanxx 
where time_zone is not null and time_zone <> '0' --and npa = '867' 
group by npa
--, nxx
, state, country, time_zone
having count(*) = (select max(count(*)) from npanxx where time_zone is not null and time_zone <> '0' --and npa = '867' 
group by npa, state, country, time_zone) 
order by npa, count(*) desc

Но этот запрос дал мне только одну строку, которая является самой высокой из всех строк, но мне нужно максимальное количество (*) всех npa, которое я получаю из моего первого запроса. Заранее благодарю за помощь. Я ищу что-то вроде этого: Из первого запроса я получаю этот результат

NPA   State  Country  Time_zone   Count(*) Column 
052    MX         MX           4             410
052    MX         MX           5             1620
052    MX         MX           6             20980
206    WA         US           4             27889
206    WA         US           5             60

И мне нужен такой ответ

NPA   State  Country  Time_zone   Count(*) Column 

052     MX  MX             6            20980
206     WA  US             4            27889
0
Mr. Jin 24 Фев 2016 в 02:09

2 ответа

Лучший ответ

Не уверен, что я полностью понимаю, что вы пытаетесь сделать, но верю, что вы пытаетесь найти, какой штат, страна, часовой пояс в каждой npa имеет наибольшее количество. Что вам нужно, так это получить текущую npa из внешнего запроса во внутренний запрос. Я считаю, что вы хотите сделать что-то вроде этого:

SELECT  
   npa,
   state,
   country,
   time_zone,
   count(*)
FROM
   npanxx outer
WHERE
   time_zone IS NOT NULL AND
   time_zone <> 0
GROUP BY
   npa,
   state,
   country,
   time_zone
HAVING
   COUNT(*) = (
      SELECT
         MAX(count(*))
      FROM
         npanxx inner
      WHERE
         time_zone IS NOT NULL AND
         time_zone <> 0 AND
         outer.npa = inner.npa
      GROUP BY
         state,
         country,
         time_zone)
ORDER BY
   npa,
   count(*) DESC

Теперь, если несколько штатов / стран / часовых_зон в npa имеют одинаковый номер, вы получите несколько строк для этого npa.

В любом случае, на данный момент я могу предположить, что вы пытаетесь сделать.

0
Scott Sosna 24 Фев 2016 в 00:11

Намного более простое решение - использовать аналитическую функцию:

select 
    npa,
    state, 
    country,
    time_zone,
    count(*) over (partition by symbol) cnt
from npanxx 
where time_zone is not null 
order by cnt desc;

Подсказка: рекомендуется сразу же устанавливать ограничения базы данных как часть дизайна таблицы. Это не позволяет пользователям вводить дубликаты, и, в качестве дополнения, ускоряет ваши запросы (поскольку Oracle использует неявный уникальный индекс для обеспечения уникальных ограничений).

0
Gee Bee 24 Фев 2016 в 00:49