2017-08-18 2 views
0

je la requête suivante dans SQL:la requête n'a pas trouvé la colonne, suggère même colonne dans Hive 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  

L'idée est de trouver l'étiquette la plus fréquente par set nom compte. Quand je lance cette requête, je reçois l'erreur suivante:

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

Je ne comprends pas pourquoi l'interprète ne trouve pas la colonne labelfrequency mais peut suggérer. Avez-vous des suggestions sur la façon d'aborder ce problème?

Modifier: si je déplace le rang() vers la partie sélectionnée, j'obtiens des résultats.

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 

Répondre

1

Les fonctions de fenêtre ne sont simplement pas autorisées dans la clause WHERE. Il y a de bonnes raisons à cela, mais vous pouvez considérer cela comme une autre règle de SQL - similaire aux alias de colonne qui ne sont pas reconnus.

(La vraie raison spécifie comment la fonction de fenêtre fonctionnerait quand il y a des conditions de filtrage multiples. Il est (presque?) Impossible de trouver un ensemble cohérent de règles.)

Ceci étant dit, vous peut simplifier votre requête:

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; 

Cela signifie que les fonctions de fenêtre et d'agrégation peuvent être combinées. Et vous n'avez pas besoin d'une sous-requête pour spécifier seulement une poignée de colonnes.