I have a table (let’s call it Table A
) like this:
ID Device Clicks 1 A 10 1 B 10 2 A 1 2 C 19
I would like to build a table (let’s call it Table B
) from A
above like this:
ID Device Clicks Percentage 1 A 10 50 1 B 10 50 2 A 1 5 2 C 19 95
Again from Table B
, I’d like to derive Table C
where the Updated Device
column for each of the ID
will carry the name from the Device
column only if the Percentage
is >=95%. If the percentage split between Devices
for each ID
is anything else, we’ll simply set UpdatedDevice
to Others
. For example, using the data in Table B
, we’ll get a Table C
like below:
ID Device Clicks Percentage UpdatedDevice 1 A 10 50 Others 1 B 10 50 Others 2 A 1 5 C 2 C 19 95 C
I am wondering if there’s a way to do this with advanced SQL windowing/analytical functions in one shot instead of generating intermediate tables.
Advertisement
Answer
select Id , Device , Clicks , Percentage , UpdatedDevice = isnull(max(UpdatedDevice) over (partition by Id),'Others') from ( select * , Percentage = convert(int,(clicks / sum(clicks+.0) over (partition by Id))*100) , UpdatedDevice = case when (clicks / sum(clicks+.0) over (partition by Id)) >= .95 then Device end from t ) as cte
test setup: http://rextester.com/XKBNO39353
returns:
+----+--------+--------+------------+---------------+ | Id | Device | Clicks | Percentage | UpdatedDevice | +----+--------+--------+------------+---------------+ | 1 | A | 10 | 50 | Others | | 1 | B | 10 | 50 | Others | | 2 | A | 1 | 5 | C | | 2 | C | 19 | 95 | C | +----+--------+--------+------------+---------------+