SQL - сумма уникальных значений из повторно используемого столбца - PullRequest
0 голосов
/ 28 октября 2018

Мне нужна сумма обуви и шляп из таблицы, содержащей имя пользователя, имя файла и полезную нагрузку.Дублирующие записи следует игнорировать, если Дублирующая запись определяется как тот же пользователь, полезная нагрузка и часть имени файла, следующая за «/».В приведенной ниже таблице примеров запись № 3 является дубликатом записи № 2 с использованием приведенных выше правил.Требуемый результат - это сумма обуви и сумма шляп, пример ниже.

Пример данных

+---+------+----------+-----------+
| # | User | Filename |  Payload  |
+---+------+----------+-----------+
| 1 | A    | a/123    | Shoes = 3 |
| 2 | A    | a/123    | Hats = 2  |
| 3 | A    | b/123    | Hats = 2  |
| 4 | B    | a/123    | Shoes = 1 |
| 5 | B    | a/123    | Hats = 1  |
+---+------+----------+-----------+

Ожидаемый результат

+-------+------+
| Shoes | Hats |
+-------+------+
|     4 |    3 |
+-------+------+

1 Ответ

0 голосов
/ 28 октября 2018

Hive поддерживает substring_index(), так что вы можете сделать:

select sum(case when payload like 'Shoes%'
                then substring_index(payload, ' = ', -1)
                else 0
           end) as num_shoes,
       sum(case when payload like 'Hats%'
                then substring_index(payload, ' = ', -1)
                else 0
           end) as num_hats
from (select t.*,
             row_number() over (partition by user, payload, substring_index(filename, '/', -1)
                                order by user
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

Я настоятельно рекомендую вам изменить модель данных, а не сохранять полезную нагрузку в виде строки. Числа должны быть сохранены как числа. Имена должны храниться как имена. Их не следует объединять в строку, если этого можно избежать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...