@SergeySafaryanc

Как объединить записи с одинаковыми столбцами, расширив временной диапазон??

Как объединить записи с одинаковыми столбцами, расширив временной диапазон??
Пример таблицы.
| id | date_from | date_to | param1 | param2 |
1 2009 2010 'A' 'A'
1 2011 2012 'A' 'A'
1 2013 2014 'B' 'B'
1 2015 2016 'A' 'A'
1 2017 2018 'A' 'A'

Так должно быть:
| id | date_from | date_to | param1 | param2 |
1 2009 2012 'A' 'A'
1 2013 2014 'B' 'B'
1 2015 2018 'A' 'A'

Пытался через оконки вытянуть последовательность, но не понимаю как дальше, с какой стороны подступиться)
select
row_number() over(partition by id order by date_from ASC) as step,
dense_rank() over(partition by id order by param1, param2) as rnk,
*
from
Table
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@SergeySafaryanc Автор вопроса
Разобрался)

select distinct
	id, 
	case 
		when
			lag(dr) over(partition by id order by rn) is null	
			or lag(dr) over(partition by id order by rn) = dr
		then 
			min(date_from) over(partition by id, dr order by rn)
		else
			min(date_from) over(partition by id, dr, rn order by rn)
	end as date_from,
	case 
		when
			lead(dr) over(partition by id order by rn) is null	
			or lead(dr) over(partition by id order by rn) = dr
		then 
			max(date_to) over(partition by id, dr order by rn DESC)
		else
			max(date_to) over(partition by id, dr, rn order by rn DESC)
	end as date_to,
	param1,
	param2
from  (
	select
		id, date_from, date_to, param1, param2,
		row_number() over(partition by id order by date_from ASC) as rn,
		dense_rank() over(partition by id order by param1, param2) as dr,
	from
		Table
	) a1
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
А разве с обычной группировкой не сработает?
SELECT id, MIN(date_from), MAX(data_to), para1, param2 FROM table GROUP BY id, param1, param2
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы