我有三个桌子
int index = Interger.ParseInt(request.getParameter("index"));
if(index <= 0){
datalist = datalist(0, 19>datalist.size()? datalist.size() : 19);
}else{
if(clicked_on_next){
datalist = datalist(index, index+19>datalist.size()? datalist.size() : index+19 );
}else{
datalist = datalist(index - 40, index-20>datalist.size()? datalist.size() : index-20 );
}
}
我必须找到 以下年龄组中最受欢迎的作者: 少于10年 10至18岁 19至35岁 36至45岁 46岁以上 其中最受欢迎的作者是获得最高评分> = 6
的作者我尝试了以下代码。
BX-Books.csv
ISBN, Book-Title, Book-Author, Year-Of-Publication, Publisher
BX-Book-Ratings.csv
User-ID ISBN Book-Rating
BX-Users.csv
User-ID Location Age
但这只是给我最高的评价。
任何人都可以告诉我如何解决此问题,因为我已经使用了三个子查询,但我知道这很丑陋
我想要每个年龄段的最高人群。
答案 0 :(得分:2)
查询的主要问题是cassandra.yaml
中缺少的partition by
和子查询中的row_number()
。此外,您应该算账本,而不是对收视率求和:
limit
我还介绍了表别名,以便查询更易于读写。
我不记得Hive是否在select aa.*
from (select author, age_range, count(*) as num_books
row_number() over (partition by age_range order by count(*) desc) as seqnum
from (select (case when u.age < 10 then 'Under 10'
when u.age between 10 and 18 then '10-18'
when u.age between 19 and 35 then '29-35'
when u.age between 36 and 45 then '36-45'
when u.age > 45 then '46 and above'
end) as age_range,
b.book_author, b.book_rating
from bx_books b join
bx_books_ratings br
on b.ISBN = br.ISBN join
bx_user u
on u.user_id = br.user_id
where br.book_rating >= 6
) b
group by book_author, age_range
) aa
where seqnum = 1;
子句中允许列别名。如果是这样,则可以轻松删除一级子查询。