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

Sql 查询与配置单元QL中另一列中的每个值关联的最短字符串值的更有效方法,sql,hive,hiveql,Sql,Hive,Hiveql,我在配置单元中有一个表,其中包含存储名称、订单ID和用户ID(以及一些其他列,包括项目ID)。表中有一行用于购买的每个项目(因此,如果订单包含多个项目,则每个订单可以有多行)。订单ID在商店内是唯一的,但在商店间不是唯一的。单个订单可以有多个与其关联的用户ID 我正在尝试编写一个查询,该查询将返回所有商店和订单ID的列表,以及与每个订单关联的最短用户ID 例如,如果数据如下所示: STORE | ORDERID | USERID | ITEMID ------+---------+-----

我在配置单元中有一个表,其中包含存储名称、订单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 
然后输出如下所示:

 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
可能
rank()
是最好的方法:

select s.*
from (select s.*, rank() over (partition by store order by length(userid) as seqnum
      from sales s
     ) s
where seqnum = 1;

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

非常感谢。我尝试了下面建议的rank()解决方案,比我原来的解决方案快。但这比那还要快。我做了,但没有公开,因为我的名声不到15岁。