ROW_NUMBER() с предложением Qualify в Vertica

#sql #vertica

#sql #vertica

Вопрос:

 select a.pm_id, a.pm_name
from loc_table a
qualify row_number() over(partition by pm_id order by pm_name asc) =1;
  

Можем ли мы написать это таким образом в Vertica, я пробовал, но ключевое слово qualify не используется Vertica, и предложение from должно быть в конце.
Кто-нибудь может объяснить, что делает приведенный выше запрос и как мы можем добиться того же в Vertica.

Ответ №1:

В Vertica нет QUALIFY предложения.

Что у него действительно есть, так это предложение analytical limit

Перепишите свой запрос, как показано ниже, и запустите простой глобальный поиск -заменяйте, если вам это часто нужно:

 SELECT 
  a.pm_id
, a.pm_name
FROM loc_table a
LIMIT 1 OVER(PARTITION BY pm_id ORDER BY pm_name ASC);
  

Ответ №2:

Я думаю, вам нужен подзапрос в Vertica:

 select pm_id, pm_name
from (select l.pm_id, l.pm_name,
             row_number() over (partition by pm_id order by pm_name asc) as seqnum
      from loc_table l
     ) l
where seqnum = 1;
  

Это в значительной степени именно то, что qualify делает. Точно так же, как having фильтры для столбцов агрегации, qualify фильтры для оконных функций.

Комментарии:

1. На самом деле я должен реализовать с предложением qualify. можете ли вы, пожалуйста, помочь мне достичь с помощью предложения qualify

2. @nodev_101 . . . Затем используйте базу данных, такую как Teradata, которая поддерживает это предложение. Вы не можете использовать что-то, что не поддерживается используемой вами базой данных.