SQL. Запрос к таблице

Рейтинг: 0Ответов: 1Опубликовано: 19.06.2023

Есть таблица:

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Принят

Не совсем понятен принцип группировки. Предположим:
Если таблица - диагональная матрица, то после ответа на последний вопрос (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 не имеют значения.