Более эффективный способ запроса кратчайшего строкового значения, связанного с каждым значением в другом столбце в Hive QL - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть таблица в 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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Проверьте, возможно, это сработает для вас, здесь вы можете достичь своей цели с помощью одного предложения "SELECT" без дополнительных затрат на SQL.

select distinct 
    store, orderid, 
    first_value(userid) over(partition by store, orderid order by length(userid) asc) f_val 
from 
    sales;

Результат будет:

store   orderid    f_val
a       1          bill
a       2          jane
b       1          tony
0 голосов
/ 27 апреля 2018

Наверное, rank() - лучший способ:

select s.*
from (select s.*, rank() over (partition by store order by length(userid) as seqnum
      from sales s
     ) s
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...