Выберите одну учетную запись, когда другие учетные записи не существуют в Hive - PullRequest
1 голос
/ 08 мая 2019

Я хочу выбрать учетные записи, когда в Hive не существует другого account_type

Я фильтрую записи с помощью Account_type = 'Second', но все записи поступают

Select Account_ID, Account_type
From Account
Where Account_type = 'Second'

Мой ожидаемый результат:

Account_ID  Account_type

102         Second

Фактический результат:

Account_ID  Account_type

101         Second 
102         Second

enter image description here

1 Ответ

0 голосов
/ 08 мая 2019

Используйте аналитические функции для вычисления флага, если для Account_ID существует account_type.

Например, эта аналитическая функция

max(case when Account_type='First'  then 1 else 0 end) over(partition by account_id) first_exists_flag

будет 1 для всех account_id=101 записи и 0 для всех других записей в вашем наборе данных.Надеюсь, у вас есть идея.

Выберите Второй тип_счета, когда Первый не существует:

with account as (
    select a.*, 
              max(case when Account_type='First'  then 1 else 0 end) over(partition by account_id) first_exists_flag,
              max(case when Account_type='Second' then 1 else 0 end) over(partition by account_id) second_exists_flag
              --you can add more such flags
          from Account a
)

select account_id, account_type
  from account a
where a.account_type='Second' and first_exists_flag=0;

Выберите Третий тип_счета, когда Первый и Второй не существуют:

with account as (
    select a.*, 
              max(case when Account_type='First'  then 1 else 0 end) over(partition by account_id) first_exists_flag,
              max(case when Account_type='Second' then 1 else 0 end) over(partition by account_id) second_exists_flag
              --you can add more such flags
          from Account a
)

select account_id, account_type
  from account a
where a.account_type='Third' and first_exists_flag=0 and second_exists_flag=0;

Вы также можете вычислить флаг, когда существует какой-либо другой тип, кроме третьего account_type:

max(case when Account_type <> 'Third'  then 1 else 0 end) over(partition by account_id) other_account_exist_flag

И отфильтровать, используя other_account_exist_flag=0

...