I have a table like this
x
source | destination | frequency
-------------------------------------
a | b | 4
a | c | 2
b | c | 1
b | a | 3
and I would like to divide the frequency
by the sum of frequency
grouped by the source
. Therefore, I am looking for a table like
source | destination | frequency
-------------------------------------
a | b | 4/6
a | c | 2/6
b | c | 1/4
b | a | 3/4
Is there any way to do this in a single sql query?
Advertisement
Answer
You can use SUM()
window function.
If you want a numerical result:
SELECT source, destination,
frequency / SUM(frequency) OVER(PARTITION BY source)
FROM tablename
Depending on your database, if it performs integer division between integers, you may need to multiply by 1.0:
SELECT source, destination,
1.0 * frequency / SUM(frequency) OVER(PARTITION BY source)
FROM tablename
If you want the result as a string you can do it with concatenation:
SELECT source, destination,
CONCAT(frequency, '/', SUM(frequency) OVER(PARTITION BY source))
FROM tablename
I used CONCAT()
, but if your database does not support it use its concatenation operator and also you may need to convert the integer values to strings.