Свернуть колонки по агрегации обновляя значения
Имеется таблица:
+-----+---------+------+----------+-----------+
| 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 |