Just wondering if I have data like
name score
A 2
B 5
C 7
I would like to have a 3rd row
name score total
A 2 14
B 5 14
C 7 14
I mean ultimately — I want to find 'z-scores' or percentiles of various row entries across various totals. I'm just not sure if there's a simple way to compare row values to aggregate values, except by a subquery such as
select A.name, A.score, B.total
from myTable A
left join
(select name, sum(score) from myTable group by name) B
on A.name = B.name
That could work but it seems inefficient querying the same table twice for what is a calculation. Is there any simpler way of doing it that I'm missing?
Best Answer
Yes, there is a way. It's called "window aggregate functions":
The
OVER ()
means that the aggregate (sum in this case) is over the whole result set. If you wanted the total over say different names (assuming you had rows with samename
, you could useOVER (PARTITION BY name)
.