Свернуть колонки по агрегации обновляя значения

Имеется таблица:

+-----+---------+------+----------+-----------+
| Agg | Version | Col1 |   Col2   |   Col3    |
+-----+---------+------+----------+-----------+
| a   |       1 | 12   | "hi1"    |    0      |
| a   |       2 | null | "hi2"    |    0      |
| a   |       3 | 12   | "hi1"    |    1      |
| a   |       4 | null | "hi2"    |    0      |
| b   |       1 | 1    | "bText"  |    0      |
| b   |       2 | 5    | null     |    0      |
| b   |       3 | null | "bText2" |    0      |
+-----+---------+------+----------+-----------+

необходимо сделать вьюху или функцию, где результат из таблицы свернуть до уникальных значений в Agg и так, чтобы значения в Col1, Col2 были теми, чтобы в Col3 была 1 или любыми если ни один из Col3 в одном Agg не равен 1. В итоге должна получиться таблица:

+-----+---------+------+----------+-------+
| Agg | Version | Col1 |   Col2   |  Col3 |
+-----+---------+------+----------+-------+
| a   |       3 |   12 | "hi1"    |   1   |
| b   |       3 |    5 | "bText2" |   0   |
+-----+---------+------+----------+-------+
create table test (
  agg varchar(10),
  version int,
  col1 int null,
  col2 varchar(25) null,
  col3 int);

insert into test values
('a', 1, 12, 'hi1', 0),
('a', 2, null, 'hi2', 0 ),
('a', 3, 12, 'hi1', 1),
('a', 4, null, 'hi2', 0),
('b', 1, 1, 'bText', 0),
('b', 2, 5, null, 0),
('b', 3, null, 'bText2', 0);

Ответы (1 шт):

Автор решения: ValNik

Попробуйте так:
Группировать по agg.
Для каждого столбца взять значение, если col3=1.
Если это значение null, взять максимальное значение этой колонки.

select agg
  ,coalesce(max(case when col3=1 then version end),max(version))version
  ,coalesce(max(case when col3=1 then col1 end),max(col1))col1
  ,coalesce(max(case when col3=1 then col2 end),max(col2))col2
  ,coalesce(max(case when col3=1 then col3 end),max(col3))col3
from test
group by agg

agg version col1 col2 col3
a 3 12 hi1 1
b 3 5 bText2 0

fiddle

→ Ссылка