Выделите отдельную строку с пустым столбцом, но не тогда, когда пустой столбец не является частью повторяющейся строки - PullRequest
0 голосов
/ 15 ноября 2018

Используя Hive, у меня есть дубликаты строк, и я хочу удалить дубликаты строк (выбирая различную строку с непустым столбцом), когда конкретный столбец пуст.Но я хочу сохранить строки, когда столбец пуст, но не в повторяющейся строке.

например, Input is

id | name | fathername | address
 1 | bob  | john       | street1
 1 | bob  | john       | 
 2 | amir | khan       |
 3 | roby | johanson   | street3

Output

id | name | fathername | address
 1 | bob  | john       | street1
 2 | amir | khan       |
 3 | roby | johanson   | street3

Мы отбросили строку дляid 1, когда адрес был пуст, потому что это была дублированная строка.Хотя адрес для идентификатора 2 отсутствует, мы все же хотим сохранить строку, потому что она не является дублированной строкой.Мне нужно это для улья.В реальной проблеме есть много столбцов, и решение должно работать с выбором *, а не с конкретными столбцами.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы можете назначить приоритет ненулевой строке адреса в order by, используя row_number.

select *
from (select t.*
      ,row_number() over(partition by id order by case when address is not null then 1 else 2 end) as rnum
      from tbl t
     ) t
where rnum = 1

Примечание. Если имеется несколько ненулевых строк, вам может потребоваться указать один или несколько столбцов, чтобы разорвать связи.

0 голосов
/ 15 ноября 2018

Вы можете использовать GROUP BY с MAX:

select id, name, fathername, max(address)
from data
group by id, name, fathername

Или, если вы хотите использовать select *:

select *
from data
where address is not null
union
select *
from data 
where address is null and id not in (
  select id 
  from data
  where address is not null
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...