Выбор нескольких записей по ключу с помощью Group By - PullRequest
0 голосов
/ 30 марта 2020

Например, у меня есть таблица базы данных 'records':

ID - RelationshipID - Country - Val

1 - 88 - UK - 6
2 - 88 - UK - 8

--- ИЗМЕНЕНИЯ В СТРАНЕ, МАКС 8 - МИН 6 = 2. Поэтому я хочу строку из моего выбора 88 - ВЕЛИКОБРИТАНИЯ - 2

3 - 88 - FR - 9
4 - 88 - FR - 11

--- ИЗМЕНЕНИЯ В СТРАНЕ, МАКС. 11 - МИН. 9 = 2. Итак, я хочу получить ряд из моего выбора 88 - FR - 2

5 - 88 - UK - 12
6 - 88 - UK - 13

- - FINI SH, MAX 13 - MIN 12 = 1. Итак, я хочу строку из моего выбора 88 - Великобритания - 1

Мне нужно выбрать записи, сгруппированные по RelationshiopID и стране, и минус максимальное значение из минимума val by country ДО изменения страны .

Что я хочу получить:

88 - UK - 2
88 - FR - 2
88 - UK - 1

Для лучшего сценария мой w * sh:

88 - UK - 3
88 - FR - 2

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Вы можете назначить номер блока, чтобы обнаружить изменение в стране, а затем сгруппировать

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
;
0 голосов
/ 30 марта 2020
  SELECT RelationShipID, Country, SUM(Val)
    FROM records
GROUP BY RelationShipID, Country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...