双加“分组”没有加入?

时间:2014-01-21 15:44:54

标签: sql hive

我有用户数据:

user  store  item  cost
1     10     100   5
1     10     101   3
1     11     102   7
2     10     101   3
2     12     103   4
2     12     104   5

我想要一张桌子,告诉我每个用户他从每家商店购买了多少以及他总共买了多少:

user store  cost_this_store  cost_total
1    10     8                15
1    11     7                15
2    10     3                12
2    12     9                12

我可以使用两个group by和一个join

执行此操作
select s.user, s.store, s.cost_this_store, u.cost_total
from (select user, store, sum(cost) as cost_this_store
      from my_data
      group by user, store) s
join (select user, sum(cost) as cost_total
      from my_data
      group by user) u
on s.user = u.user

然而,如果我用其他任何语言写这个,我绝对不会这样做(join显然是可以避免的,而且group by不是独立的。) 是否可以避免join中的sql

PS。我需要解决方案在hive中工作。

1 个答案:

答案 0 :(得分:6)

您可以使用windowing function来执行此操作... Hive在去年增加了支持:

select distinct
  user, 
  store, 
  sum(cost) over (partition by user, store) as cost_this_store,
  sum(cost) over (partition by user) as cost_total
from my_data

但是,我认为你的原始实现没有任何明显的错误。你基本上有两组不同的数据,你通过JOIN组合。

复制可能看起来像是一种不同语言的代码气味,但这不一定是SQL中的错误方法,并且通常你必须采取这样的方法来复制两个中间的查询的一部分出于性能原因的结果集。

SQL Fiddle (SQL Server)