2011-02-18 2 views
0

Oracle에 id, fname, lname, addr, city, state, zip 등의 'People'테이블이 있습니다. 9.x의데이터가있는 기존 테이블에서 도시에 가장 많은 채워진 우편 번호를 가져 오는

내가이 쿼리 작성

주 당시 당 가장 인구가 우편 번호를 얻으려면 :

Select City, State, Zip, count(*) 
From People 
Group By City, State 
Order By count(*) 

를하지만 국가처럼, (를 들어 나에게 도시에 대한 여러 행을 제공합니다 구성) : -

오류 메시지가 카운트 ( )를 갖는 = 최대 (카운트 ())하지만 가지고 :
City -- State -- Zip -- Count(*) 
City0 -- ST0 -- 32111 -- 50 
City1 -- ST1 -- 11223 -- 100 
City1 -- ST1 -- 11225 -- 90 
City1 -- ST1 -- 11226 -- 50 
City2 -- ST1 -- 11255 -- 70 
City3 -- ST2 -- 55443 -- 60 

내가 좋아하는 HAVING 절 시도 NESTED 절은 너무 깊이 또는 somethig에 가지고 (오라클 9.x의)

난 단지 원하는 TOP 행 : -City1 - ST1 - 11223 - 100 모든 City1 - ST1 행, 동일하게 유지 될 도시 당 도시 당 하나의 행만있는 기타 행. 원할 경우 출력 : -

City -- State -- Zip -- Count(*) 
City0 -- ST0 -- 32111 -- 50 
**City1 -- ST1 -- 11223 -- 100** 
City2 -- ST1 -- 11255 -- 70 
City3 -- ST2 -- 55443 -- 60 

어떻게해야합니까? 보고 주셔서 감사합니다. 내가 좀 잘 그것을 가지고 제공된 쿼리를 수정하여 JIM 허드슨의 REPLY 찾았

==========

답변. 최종 코드 : -

select city, state, zip, counter from (
select city, state, zip, count(*) as counter from people group by city, state, zip 
) 
where counter = (
    select max(count2) from (
     select city as city1, state as state1, zip as zip1, count(*) as count2 from people group by city, state, zip ) 
    where city=city1 and state=state1 
); 
+0

이 - 당신은 각 도시에 대해 하나 개의 행을 얻을 것이다/주 –

답변

0

첫 번째 쿼리를보기로 생각하십시오. 그것은 당신에게 도시, 주, 우편 번호에 대한 카운트를 제공합니다. 그런 다음이를 시작점으로 사용하십시오. 가장 큰 우편 번호에서 인구를 얻는 것은 그 다음 쉬울 것이다. 예를 들어

물론

select city, state, max(counter) from 
(select city, state, zip, count(*) as counter from people group by city, state, zip) 
group by city, state; 

, 그것은 당신이 그 어떤 우편 알고 싶어하기 때문에 원하는 것을 확실히 아니다. 따라서 오래된 방법은 다음과 같습니다.

select city, state, zip, counter from 
(select city, state, zip, count(*) as counter from people group by city, state, zip) 
where counter = (select max(count2) from (select city, state, zip, count(*) as count2 from people group by city, state, zip)); 

분석 함수를 사용하여 두 번째 단계를 수행하는 다른 방법이 있습니다. 나는 다른 이들에게 그 일을하도록 허락 할 것이다. 그러나 중요한 단계는 인라인보기를 작성하고 추가 분석을위한 기초로 사용하는 것입니다. 도시와 국가가 당신 만 그룹 만 도시와 주 (플러스 개수)을 선택하면

+0

내가 두번째 쿼리를 실행, 난 그냥 단일 행을 얻을 뒤 : - 열 = 도시 주 우편 번호 카운터 | values ​​= MEMPHIS TN 38109 1258 –

2
select * from (
    select city, state, zip, 
    rank() over (partition by city, state order by cnt desc) rank 
    from (
    Select City, State, Zip, count(*) cnt 
    From People 
    Group By City, State, Zip 
) 
) 
where rank = 1 
+1

+1 이것은 가장 우아한 솔루션입니다. – jachguate

+0

+1 TBS 1 개, 나머지 2 개. – erbsock

관련 문제