2017-10-10 6 views
1

各国で最も人気のあるアーティストを見つけるSQLクエリを作成しようとしています。人気のアーティストが ハイブを2つのフィールドでグループ化して最大数を選択

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 

以下は、私が書いた1つのクエリですが、それは動作していない、> =以下

8は、テーブル構造である定格の最大数を有するものです。あなたはそれぞれの国の中で最も人気のあるアーティスト(高評価 - より人気)を見つけるためにウィンドウ関数row_numberを使用することができます

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

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; 

を私は評価されるべきだと思うので、私は、代わりに合計(レーティング)を仮定添加剤。

また、古いコンマベースの結合ではなく、明示的な結合構文を使用してください。

関連する問題