我有用户数据:
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
中工作。
答案 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中的错误方法,并且通常你必须采取这样的方法来复制两个中间的查询的一部分出于性能原因的结果集。