SemanticException [Ошибка 10004] Неверный псевдоним таблицы или ссылка на столбец - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь взять записи по первой строке в каждой группе по идентификатору. номер строки генерируется по порядку идентификатора. Я продолжаю получать ту же ошибку [10004].

Этот скрипт куста построен в среде SAS studio, а следующий фрагмент кода pro c sql:

набор данных id_f содержит переменные x, y и z

execute (create temporary table event_id_f1 as
        select *,ROW_NUMBER() OVER(ORDER BY id) as rownum
        from id_f
                        group by id
                        having rownum = min(rownum)
        )
by df20;

Ошибка: Ошибка выполнения: org. apache .hive.service.cli.HiveSQLException: Ошибка при компиляции оператора: FAILED: SemanticException [Ошибка 10004 ]: Строка 1: 129 Недопустимый псевдоним таблицы или ссылка на столбец 'rownum': (возможные имена столбцов: x, y, z)

Оцените любую помощь!

@ bern ie предположил, что Hive не распознает псевдоним. Как мне вложить псевдоним, чтобы он работал? Код также находится в операторе исполнения. Моя попытка:

execute (create temporary table event_id_f1 as

        from (
             select *,
             ROW_NUMBER() OVER(ORDER BY id) as rownum
             from id_f
              group by id
              having rownum = min(rownum) ) ranked
             WHERE ranked=1
             )
by df20;

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Я бы так написал. Дайте мне знать, если есть какая-либо ошибка:

execute (create temporary table event_id_f1 as
    select * 
    from (
        select id, ROW_NUMBER() OVER (ORDER BY id) as rownum
        from id_f
        group by id 
    ) ranked
    where ranked.rownum = 1         
) by df20;
1 голос
/ 07 января 2020

По моему скромному мнению, следующее SQL проблематично c (взято из другого ответа):

select * 
from (
    select id, ROW_NUMBER() OVER (ORDER BY id) as rownum
    from id_f
    group by id 
) ranked
where ranked.rownum = 1

Этот запрос разбивается на три этапа:

Сначала select id from id_f group by id, что эквивалентно получению всех отличных id.

Затем создайте глобальное окно для order by этих разных идентификаторов и присвойте каждому из них номер строки.

Наконец, фильтр where ranked.rownum = 1 позволяет результирующему набору содержать только одну строку:

minimal_id, 1

Если это действительно все, что вам нужно, использовать min должно быть намного лучше.

Этот вопрос на первый взгляд не имел для меня особого смысла. Я думаю, что вы ищете, чтобы partition by id, и в каждом разделе, order by something_else, а затем выберите строку, ранжированную в первую очередь в этих отдельных разделах. Если, к счастью, мои предположения верны, я бы предложил что-то вроде этого:

select 
    * 
from (
    select 
        *, ROW_NUMBER() OVER (partition by id ORDER BY STH_ELSE) as rownum
    from id_f
) ranked
where ranked.rownum = 1
...