Как правило, вы хотите разделить данные по дате (и предположительно id
) и рекомбинировать:
with cte as (
select id, param1, param2, null as param3, dfrom, 'ft' as which
from ft
union all
select id, null, null, param3, dfrom, 'st'
from st
)
select id, dfrom, lead(dfrom) over (order by dfrom),
max(max(param1)) over (partition by grp_ft) as param1,
max(max(param2)) over (partition by grp_ft) as param2,
max(max(param3)) over (partition by grp_st) as param3
from (select cte.*,
max(dfrom) filter (where which = 'ft') over (partition by id order by dfrom) as grp_ft,
max(dfrom) filter (where which = 'st') over (partition by id order by dfrom) as grp_st
from cte
) cte
group by id, dfrom, grp_ft, grp_st;
Это разделяет данные по значениям параметров. Затем он использует оконные функции для их рекомбинации, накапливая предыдущее значение, если оно есть. Если Postgres поддерживает параметр IGNORE NULLS
на LAG()
, подзапрос не понадобится.
Здесь - это дБ <> скрипка.
Эта версия не учитывает окончательную дату Проблема в том, что вы не объясняете, что делать (если вы хотите пересмотреть, я бы порекомендовал задать новый вопрос).
Проблема в том, что у вас, по-видимому, есть действительные значения NULL
в данных , Обычно, я просто сбрасывал бы значения на NULL
, но это кажется слишком большим предположением.