Есть ли способ проверить несколько столбцов, используя условие «IN» в Redshift Spectrum? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблица Redshift Spectrum с именем customer_details_table, где столбец id не является уникальным. У меня есть другой столбец hierarchy, который основан на том, какая запись должна иметь приоритет, если они имеют одинаковый идентификатор. Вот пример:

enter image description here

Здесь, если мы несколько раз встречаемся с одним и тем же идентификатором 28846, мы выберем Джона в качестве квалифицируемого учитывая, что у него максимальная иерархия.

Я пытаюсь создать этот столбец eligibility, используя group by на id, а затем выбираю запись, соответствующую максимальному hierarchy. Вот мой SQL код:

SELECT *,
CASE WHEN (
     (id , hierarchy) IN 
            (SELECT id , max(hierarchy)
            FROM
              customer_details_table
            GROUP BY id
            )
) THEN 'Qualified' ELSE 'Disqualified' END as eligibility
FROM
  customer_details_table

При выполнении этого я получаю следующую ошибку:

SQL Error [500310] [XX000]: [Amazon](500310) Invalid operation: This type of IN/NOT IN query is not supported yet;

Приведенный выше код работает нормально, когда моя таблица (customer_details_table) является обычной Таблица красного смещения, но происходит сбой, когда эта же таблица является внешней таблицей спектра. Кто-нибудь может предложить хорошее решение / альтернативу для достижения того же логика c в таблицах спектра?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете использовать оконные функции для создания столбца eligibility: в основном вам нужно разделить строки на id и ранжировать по убыванию hierarchy в каждой группе.

select
    *,
    case when row_number() over(partition by id order by hierarchy desc) = 1
        then 'Qualified' else 'Disqualified'
    end eligibility
from customer_details_table
1 голос
/ 02 апреля 2020

Вы можете использовать оконные функции:

select cdt.*
from (select cdt.*,
             row_number() over (partition by id order by hierarchy desc) as seqnum
      from customer_details_table cdt
     ) cdt
where seqnum = 1;
...