web-dev-qa-db-ja.com

Hiveを使用してグループの最初の行を検索する

次の形式の学生データベースの場合

Roll Number | School Name | Name | Age | Gender | Class | Subject | Marks

各クラスで誰が最高だったかを知る方法は?以下のクエリはグループ全体を返しますが、グループの最初の行を見つけることに興味があります。

select school,class,roll,sum(marks) as total from students group by school,class,roll order by school, class, total desc;
12
Praveen Sripati

目的の結果を得るには、もう1つのグループ化と参加が必要になります。これは行う必要があります:

select q1.*, q2.roll from 

(
select school, class, max(total) as max from 
(
select school,class,roll,sum(marks) as total from students group by school,class,roll order by school, class, total desc
)q3 group by school, class
)q1

LEFT OUTER JOIN

(select school,class,roll,sum(marks) as total from students group by school,class,roll order by school, class, total desc)q2

ON (q1.max = q2.total) AND (q1.school = q2.school) AND (q1.class = q2.class)
3
Amar

row_number() を使用する別の方法

_select * from (
    select *, 
    row_number() over (partition by school,class,roll order by marks desc) rn
    from students
) t1 where rn = 1
_

トップマークのすべての同点を返したい場合は、rank()の代わりにrow_number()を使用します

44
FuzzyTree

あなたが提供したクエリに基づいて構築する必要があります:

  1. 指定されたクエリは、ロールごとのクラスごとのマークを提供します。クラスごとに達成された最高の合計を見つけるには、選択からロール番号を削除してから、このクエリでグループ化する必要があります。

  2. これで、学校、クラス、および学校ごとのクラスごとの最高合計がわかりました。この合計に対応するロール番号を見つける必要があります。そのためには、結合が必要になります。

最終的なクエリは次のようになります。

select a.school, a.class, b.roll, a.highest_marks from
    (select q.school as school, q.class as class, max(q.total) as highest_marks from(select school, class, roll, sum(marks) as total from students group by school, class, roll)q group by school, class)a
    join
    (select school, class, roll, sum(marks) as total from students group by school, class, roll)b
    on (a.school = b.school) and (a.class = b.class) and (a.highest_marks = b.total)
0
Abhishek Pathak