SQL. Запрос к таблице
Есть таблица:
| id | fdate | s_1 | s_2 | s_3 | s_4 |
|---|---|---|---|---|---|
| 1 | 2023-01-01 | Да | |||
| 2 | 2023-01-01 | Нет | |||
| 3 | 2023-01-01 | Да | |||
| 4 | 2023-01-01 | Да | |||
| 5 | 2023-01-01 | Да | |||
| 6 | 2023-01-01 | Да | |||
| 7 | 2023-01-01 | Нет | |||
| 8 | 2023-01-01 | Да | |||
| 9 | 2023-01-02 | Да | |||
| 10 | 2023-01-02 | Нет | |||
| 11 | 2023-01-02 | Нет | |||
| 12 | 2023-01-02 | Да |
Нужно в запросе вывести:
| id | fdate | s_1 | s_2 | s_3 | s_4 |
|---|---|---|---|---|---|
| 1 | 2023-01-01 | Да | Нет | Да | Да |
| 5 | 2023-01-01 | Да | Да | Нет | Да |
| 9 | 2023-01-02 | Да | Нет | Нет | Да |
Как такое можно реализовать с помощью хранимой процедуры (функции)?
Ответы (1 шт):
Автор решения: ValNik
→ Ссылка
Не совсем понятен принцип группировки. Предположим:
Если таблица - диагональная матрица, то после ответа на последний вопрос (s_4 - не пусто), начинается новая группа.
Посмотрите пример:
-- test data
create table test (id int,fdate date,s_1 varchar(10),s_2 varchar(10)
,s_3 varchar(10),s_4 varchar(10));
insert into test values
( 1,'2023-01-01','Да' ,null,null,null)
,( 2,'2023-01-01',null,'Нет',null,null)
,( 3,'2023-01-01',null,null,'Да',null)
,( 4,'2023-01-01',null,null,null,'Да')
,( 5,'2023-01-01','Да',null,null,null)
,( 6,'2023-01-01',null,'Да',null,null)
,( 7,'2023-01-01',null,null,'Нет',null)
,( 8,'2023-01-01',null,null,null,'Да')
,( 9,'2023-01-02','Да',null,null,null)
,(10,'2023-01-02',null,'Нет',null,null)
,(11,'2023-01-02',null,null,'Нет',null)
,(12,'2023-01-02',null,null,null,'Да')
-- еще дополнительно
,(21,'2023-01-02','Да',null,null,null)
,(22,'2023-02-02',null,null,null,'Да')
;
--query
select grn,min(id)id,min(fdate)
,max(s_1) s_1,max(s_2) s_2,max(s_3) s_3,max(s_4) s_4
from(
select *
,sum(cnt)over(order by id) grn
from(
select *
,case when lag(s_4,1,s_1)over(order by id) is not null then 1 else 0 end cnt
from test
)t1
)t2
group by grn
Результат такой
| grn | id | mindate | s_1 | s_2 | s_3 | s_4 |
|---|---|---|---|---|---|---|
| 1 | 1 | 2023-01-01 | Да | Нет | Да | Да |
| 2 | 5 | 2023-01-01 | Да | Да | Нет | Да |
| 3 | 9 | 2023-01-02 | Да | Нет | Нет | Да |
| 4 | 21 | 2023-01-02 | Да | null | null | Да |
Колонки Id и fdate не имеют значения.