我有用户数据:
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
Run Code Online (Sandbox Code Playgroud)
我想要一张桌子告诉我每个用户他从每家商店购买了多少以及他总共买了多少钱:
user store cost_this_store cost_total
1 10 8 15
1 11 7 15
2 10 3 12
2 12 9 12
Run Code Online (Sandbox Code Playgroud)
我可以用两个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
Run Code Online (Sandbox Code Playgroud)
然而,如果我用其他任何语言写这个(join
显然可以避免,并且两者group by
不是独立的),这绝对不是我会这样做的.
是否有可能避免join
进入sql
?
PS.我需要解决方案才能工作hive
.
你可以通过窗口函数来实现这一点...... 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
Run Code Online (Sandbox Code Playgroud)
但是,我认为你的原始实现没有任何明显的错误.你基本上有两组不同的数据,你通过它们组合JOIN
.
复制可能看起来像是一种不同语言的代码气味,但这不一定是SQL中的错误方法,并且通常你必须采取这样的方法,在两个中间结果集之间复制一部分查询表现原因.