2017-10-10 1 views
1

각 국가에서 가장 인기있는 아티스트를 찾으려면 SQL 쿼리를 작성하려고합니다. 인기 작가는 하이브 두 필드를 그룹화하여 최대 값 선택

describe album; 
albumid    string          
album_title    string          
album_artist    string`        

describe album_ratings; 
userid     int           
albumid    string          
rating    int           

describe cusers; 
userid     int           
state     string          
country     string 

다음은 내가 쓴 하나 개의 쿼리이지만 작동하지 않습니다,> = 아래

8 테이블 구조 평가의 최대 수를 가지고 하나입니다.

select album_artist, country, count(rating) 
from album, album_ratings, cusers 
where album.albumid=album_ratings.albumid 
     and album_ratings.userid=cusers.userid 
     and rating>=6 
group by country, album_artist 
having count(rating) = (
         select max(t.cnt) 
         from (
           select count(rating) as cnt 
           from album, album_ratings, cusers 
           where album.albumid=album_ratings.albumid 
           and album_ratings.userid=cusers.userid 
           and rating>=6 
           group by country, album_artist 
          ) as t 
         group by t.country 
         ); 

답변

0

적절하고 명시적인 JOIN 구문을 사용하는 방법을 익히십시오. 쉼표는 FROM 절에 사용하십시오. 당신이 관계를 원하는 경우에,

select * 
from (select album_artist, country, count(*) as cnt, 
      row_number() over (partition by country order by count(*) desc) as seqnum 
     from album a join 
      album_ratings ar join 
      on a.albumid = ar.albumid 
      cusers u 
      on ar.userid = u.userid 
     where rating >= 6 
     group by country, album_artist 
    ) aru 
where seqnum = 1; 

을 대신 row_number()rank()를 사용

당신은 윈도우 기능이 작업을 수행 할 수 있습니다.

0
당신은 (높은 등급 - 인기) 각 나라에서 가장 인기있는 아티스트를 찾기 위해 윈도우 함수 row_number을 사용할 수 있습니다

: 나는 평가가 있어야한다고 생각하기 때문에,

select * 
from (
    select c.country, 
     a.album_artist, 
     sum(rating) as total_rating, 
     row_number() over (partition by c.country order by sum(rating) desc) as rn 
    from cusers c 
    join album_ratings r on c.userid = r.userid 
    join album a on r.albumid = a.albumid 
    where r.rating >= 8 
    group by c.country, 
     a.album_artist 
    ) t 
where rn = 1; 

내가 합 (평가)를 가정하는 대신 첨가물.

또한 이전의 쉼표 기반 조인 대신 명시 적 조인 구문을 사용하십시오.