У меня есть таблица в Hive, содержащая названия магазинов, идентификаторы заказов и идентификаторы пользователей (а также некоторые другие столбцы, включая идентификатор элемента). В таблице есть строка для каждого приобретенного товара (поэтому в заказе может быть несколько строк, если заказ содержит несколько товаров). Идентификаторы заказа уникальны в магазине, но не в разных магазинах. С одним заказом может быть связано несколько идентификаторов пользователей.
Я пытаюсь написать запрос, который вернет список всех магазинов и идентификаторов заказов и кратчайший идентификатор пользователя, связанный с каждым заказом.
Так, например, если данные выглядят так:
STORE | ORDERID | USERID | ITEMID
------+---------+--------+-------
| a | 1 | bill | abc |
| a | 1 | susan | def |
| a | 2 | jane | abc |
| b | 1 | scott | ghi |
| b | 1 | tony | jkl |
Тогда результат будет выглядеть так:
STORE | ORDERID | USERID
------+---------+-------
a | 1 | bill
a | 2 | jane
b | 1 | tony
Я написал запрос, который сделает это, но я чувствую, что должен быть более эффективный способ сделать это. Кто-нибудь знает лучший способ получить эти результаты?
Это то, что я имею до сих пор:
select
users.store, users.orderid, users.userid
from
(select
store, orderid, userid, length(userid) as len
from
sales) users
join
(select distinct
store, orderid,
min(length(userid)) over (partition by store, orderid) as len
from
sales) len on users.store = len.store
and users.orderid = len.orderid
and users.len = len.len