查询与Hive QL中另一列中的每个值关联的最短字符串值的更有效方法

时间:2018-04-27 13:56:42

标签: sql hive hiveql

我在Hive中有一个表,其中包含商店名称,订单ID和用户ID(以及包括商品ID在内的其他一些列)。表中有一行用于购买的每件商品(因此,如果订单包含多个商品,则每个订单可以有多行)。订单ID在商店中是唯一的,但不是在商店之间。单个订单可以有多个与之关联的用户ID。

我正在尝试编写一个查询,该查询将返回所有商店和订单ID的列表以及与每个订单相关联的最短用户ID。

因此,例如,如果数据如下所示:

 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 :(得分:0)

可能 "scripts": { "dev": "NODE_ENV=myValue myProgram" } 是最好的方法:

MYVAR=myOtherValue

答案 1 :(得分:0)

查看这可能对您有用,在这里您可以实现单个“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