Estoy tratando de ejecutar esta consulta en la Colmena para devolver sólo el top 10 de las url que aparecen más a menudo en el adimpression tabla.

select
        ranked_mytable.url,
        ranked_mytable.cnt

from
        ( select iq.url, iq.cnt, rank() over (partition by iq.url order by iq.cnt desc) rnk
        from
                ( select url, count(*) cnt
                from store.adimpression ai
                        inner join zuppa.adgroupcreativesubscription agcs
                                on agcs.id = ai.adgroupcreativesubscriptionid
                        inner join zuppa.adgroup ag
                                on ag.id = agcs.adgroupid
                where ai.datehour >= '2014-05-15 00:00:00'
                        and ag.siteid = 1240
                group by url
                ) iq
        ) ranked_mytable

where
      ranked_mytable.rnk <= 10

order by
        ranked_mytable.url,
        ranked_mytable.rnk desc

;

Por desgracia me sale un mensaje de error que indica:

FAILED: SemanticException [Error 10002]: Line 26:23 Invalid column reference 'rnk'

He tratado de depurar y hasta el ranked_mytable sub-consultas todo va suave. He tratado de comentar el where ranked_mytable.rnk <= 10 cláusula, pero el mensaje de error sigue apareciendo.

OriginalEl autor Gianluca | 2014-05-16

3 Comentarios

  1. 11

    Colmena es incapaz de ordenar por una columna que no está en la «salida» de una instrucción select. Para solucionarlo, basta con incluir la columna en las columnas seleccionadas:

    select
            ranked_mytable.url,
            ranked_mytable.cnt,
            ranked_mytable.rnk
    
    from
            ( select iq.url, iq.cnt, rank() over (partition by iq.url order by iq.cnt desc) rnk
            from
                    ( select url, count(*) cnt
                    from store.adimpression ai
                            inner join zuppa.adgroupcreativesubscription agcs
                                    on agcs.id = ai.adgroupcreativesubscriptionid
                            inner join zuppa.adgroup ag
                                    on ag.id = agcs.adgroupid
                    where ai.datehour >= '2014-05-15 00:00:00'
                            and ag.siteid = 1240
                    group by url
                    ) iq
            ) ranked_mytable
    
    where
          ranked_mytable.rnk <= 10
    
    order by
            ranked_mytable.url,
            ranked_mytable.rnk desc
    
    ;
    

    Si usted no quiere que ‘rnk’ de la columna en el resultado final, espero que usted podría ajustar de que toda la cosa, en otra del interior de la consulta y simplemente seleccione la ‘dirección’ y ‘cnt’ campos.

    Gracias por la sugerencia Joe! Agregar el rnk variable en los resultados se soluciona el error que tengo que hacer. Por desgracia, no limita los resultados a los top 10 de las filas. Una mejor solución sería utilizar SORT BY y LIMIT en combinación.

    OriginalEl autor Joe K

  2. 3

    RANK OVER no es la mejor función para lograr este objetivo.
    Una mejor solución sería el uso de una combinación de SORT BY y LIMIT. Es cierto, de hecho LIMIT escoge al azar a las filas de una tabla, pero esto puede evitarse si se utiliza con la SORT BY función. Desde el Apache Wiki:

    -- Top k queries. The following query returns the top 5 sales records wrt amount. 
    SET mapred.reduce.tasks = 1 SELECT * FROM sales SORT BY amount
    DESC LIMIT 5
    

    La consulta puede ser re-escrito de esta forma:

    select
            iq.url,
            iq.cnt
    
    from
            ( select url, count(*) cnt
            from store.adimpression ai
              inner join zuppa.adgroupcreativesubscription agcs
                on agcs.id = ai.adgroupcreativesubscriptionid
              inner join zuppa.adgroup ag
                on ag.id = agcs.adgroupid
            where ai.datehour >= '2014-05-15 00:00:00'
              and ag.siteid = 1240
            group by url ) iq
    
    sort by
            iq.cnt desc
    
    limit
            10
    
    ;
    

    OriginalEl autor Gianluca

  3. -1

    Poner as antes de la rnk variable. Debería funcionar bien.

    Bienvenido a! Trate de dar más explicación a sus respuestas. Usted debe registrar el código corregido, a menos que la sección. Consulte Cómo responder a la página para obtener ayuda en la mejora de su respuesta.

    OriginalEl autor user5225202

Dejar respuesta

Please enter your comment!
Please enter your name here