Вы можете назначить номер блока, чтобы обнаружить изменение в стране, а затем сгруппировать
drop table if exists t;
create table t
(ID int, RelationshipID int, Country varchar(2), Val int);
insert into t values
(1 , 88 , 'UK' , 6),
(2 , 88 , 'UK' , 8),
(3 , 88 , 'FR' , 9),
(4 , 88 , 'FR' , 11),
(5 , 88 , 'UK' , 12),
(6 , 88 , 'UK' , 13);
select block,country,min(val) minval,max(val) maxval,
max(val) - min(val) diff
from
(
select t.*,
if(country<>@country,@block:=@block+1,@block:=@block) block,
@country:=country
from t
cross join (select @block:=0,@country:='') b
order by id
) s
group by s.block,s.country;
+-------+---------+--------+--------+------+
| block | country | minval | maxval | diff |
+-------+---------+--------+--------+------+
| 1 | UK | 6 | 8 | 2 |
| 2 | FR | 9 | 11 | 2 |
| 3 | UK | 12 | 13 | 1 |
+-------+---------+--------+--------+------+
3 rows in set (0.093 sec)
Если вы хотите, чтобы первое и последнее значение в каждом блоке, тогда получали минимальный и максимальный идентификаторы в подзапросе и присоединиться к группировке по блокам и странам
select a.block,a.country,a.minid,a.maxid,
sum(case when t.id = maxid then val else 0 end) -
sum(case when t.id = minid then val else 0 end) diff
from t
join
(select block,country,min(id) minid,max(id) maxid
from
(
select t.*,
if(country<>@country,@block:=@block+1,@block:=@block) block,
@country:=country
from t
cross join (select @block:=0,@country:='') b
order by id
) s
group by s.block,s.country
) a on t.id =a.minid or t.id = a.maxid
group by a.block,a.country
;