2011-02-14 2 views
0

스키마 :SQL 쿼리 최고 3

Cereal 
Cereal_name 
Buyer_name 

Cereal_name는 시리얼
Buyer_name의 이름 난 각각의 시리얼 번호를 나열하려고

특정 시리얼을 가져 구매자입니다 그들이 구입 된 시간 중 최고 4 개 시리얼을 찾으십시오. 답변의 예는 다음과 같습니다.

'HoneyNut' 400 
'Cap'n Crunch' 400 
'Chocolate Flakes' 300 
'Frosted Flakes' 200 

참고 : ther 그 중 하나가 같은 수의

을 가지고 있기 때문에 전자는 내가 가지고있는 것은, 4 있습니다

Select Cereal_name, count(*) as numOfCount 
From Cereal 
Group By numOfCount Desc 

내가

감사합니다 사전에이 경우 그 실 거예요 작업 rowNum<=3를 사용하고 싶었지만!

+1

어떤 데이터베이스입니까? –

+1

어떤 RDBMS를 사용하고 있습니까? 'rowNum'은 어디에 정의되어 있습니까? –

+0

DB2를 사용하고 있습니다. rownum이 주어 졌다고 생각합니까? 아닙니다. – user308553

답변

2

봅니다 :

SELECT * FROM 
(SELECT 
    Cereal_name, 
    COUNT(*) as numOfCount 
FROM Cereal 
GROUP BY numOfCount 
ORDER BY COUNT(*) DESC 
) CEREALS 
WHERE ROWNUM <= 3 

나는 오라클을 가정한다.

는 DB2 :

아마이

, 그러나 나는 확실하지 않다 :

SELECT 
    Cereal_name, 
    COUNT(*) as numOfCount 
FROM Cereal 
GROUP BY numOfCount 
ORDER BY COUNT(*) DESC 
FETCH FIRST 3 ROWS ONLY 
+0

답장을 보내 주셔서 감사합니다. 그러나 wouldnt rownum <= 3은 목록의 처음 3 줄만 제공합니까? 구매자 수에 동률 점수가있는 경우 상위 3 행 이상이 될 것입니다. – user308553

+0

@ user308553 : ROWNUM은 처음 3 행을 제공하지만 select에서 선택하여 올바른 것을 가져와야합니다. – LukLed

+0

죄송합니다. 아직 sql에 익숙하지 않습니다. select * 할 때의 요점을 이해하지 못합니다. (*) CUALAL ROWNUM <= 3 – user308553

1

당신이 거기 당신을 얻을해야 표준 ANSI SQL의 윈도우 함수를 사용하여, DB2의 호환성 모드를 사용할 수없는 경우 :

 
select * 
from (
    select t1.*, 
     dense_rank() over (order by cereal_count) as rank 
    from (
    select cereal_name, 
      count(*) as cereal_count 
    from cereal 
    group by cereal_name 
) t1 
) t2 
where rank <= 3 
order by rank desc 
+0

영업 담당자가 동점자를 표시하려고합니다 – RichardTheKiwi

+0

감사합니다. 예를 편집했습니다. –

1

어쩌면?

SELECT G.Cereal_name, G.numOfCount 
FROM (
    Select Cereal_name, count(*) as numOfCount 
    From Cereal 
    Group By Cereal_name) G 
inner join (
    Select DISTINCT count(*) as numOfCount 
    From Cereal 
    Group By Cereal_name 
    order by numOfCount Desc 
    FETCH FIRST 3 ROWS ONLY) C on C.numOfCount = G.numOfCount 
order by G.numOfCount DESC