2017-08-18 3 views
0

私はSQLで次のクエリがあります。クエリが列を見つけていない、ハイブSQLで同じカラムを示唆

select midquery.account, midquery.name, midquery.label, midquery.labelfrequency 
from(

    -- Count the appearance of each label. 

    select count(*) as labelfrequency, account, name, label 
    from(

     select account, name, label from myTable 

    ) innerquery 

    group by account, name, label 
) midquery 

-- Select most frequent values only. 
where rank() over 
    (partition by midquery.account, midquery.name 
    order by midquery.labelfrequency desc) = 1  

をアイデアは、名前、アカウントのセットごとに、最も頻繁にラベルを見つけることです。

Error while compiling statement: FAILED: SemanticException [Error 10002]: Line 12:74 Invalid column reference 'labelfrequency': (possible column names are: labelfrequency, account, name, label) 

インタプリタが列labelfrequencyを見つけることができませんが、それを示唆することができますなぜ私はかなり理解していない:私はこのクエリを実行すると、私は次のエラーを取得します。この問題に取り組む方法の提案はありますか?

編集:選択部分にランク()を移動すると結果が表示されます。

select midquery.account, midquery.name, midquery.label, midquery.labelfrequency, 
    rank() over (partition by midquery.account, midquery.name 
    order by midquery.labelfrequency desc) 
from(

    -- Count the appearance of each label. 

    select count(*) as labelfrequency, account, name, label 
    from(

     select account, name, label from myTable 

    ) innerquery 

    group by account, name, label 
) midquery 

答えて

1

ウィンドウ機能は、WHERE節では許可されません。これには十分な理由がありますが、それをSQLのもう1つのルールと考えることができます。列の別名が認識されないのと同様です。

は(本当の理由は、複数のフィルタ条件がある場合、ウィンドウ関数が動作する方法を指定される。これは、ルールの一貫したセットを思い付くために(ほとんど?)不可能です。)もし、という

を言って

select t.account, t.name, t.label, t.labelfrequency 
from (select count(*) as labelfrequency, account, name, label, 
      rank() over (partition by account, name 
          order by count(*) desc 
         ) as seqnum 
     from myTable t 
     group by account, name, label 
    ) t 
where seqnum = 1; 

つまり、ウィンドウ関数と集約関数を組み合わせることができます。また、列をほんの一握りにするためにサブクエリは必要ありません。

関連する問題