with siv (id, dt_from, agreement_version, line_version, agreement_is_actual, siv_is_actual, cost, prob) as (VALUES (1,'2025-01-01'::date, 1, 1, true, true, 100, 100), (2,'2025-02-01', 1, 10, false, true, 200, 10), (3,'2025-02-01', 1, 12, true, true, 200, 100), (4,'2025-03-01', 2, 20, true, true, 100, 100), (5,'2025-03-01', 2, 21, true, true, 150, 100), (6,'2025-02-15', 3, 30, true, true, 300, 100), (7,'2025-04-01', 4, 40, false, true, 100, 100), (8,'2025-03-15', 2, 25, false, false, 1000, 50) ) --SELECT --(LAST_VALUE (dt_from) OVER (ORDER BY dt_from, agreement_version,line_version RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)), --coalesce((LEAD(dt_from) OVER (ORDER BY dt_from, agreement_version,line_version)), (select max(dt) from elma.mv_dt)) dt_next, --* from siv -- выбрать рабочую лесенку и базовую лесенку, посмотреть на них SELECT t.*, coalesce((LEAD(t.dt_from) OVER (/*PARTITION BY line_key*/ ORDER BY t.dt_from, t.agreement_version,t.line_version)), (select max(dt) from elma.mv_dt)) dt_next, (select id from ( SELECT *, MIN(dt_from) OVER (/*PARTITION BY line_key*/ ORDER BY agreement_version desc,line_version desc) running_min_dt FROM siv where siv_is_actual AND prob=100 AND agreement_is_actual ) b where b.dt_from=b.running_min_dt AND b.dt_from <= t.dt_from ORDER BY dt_from desc, agreement_version desc,line_version desc LIMIT 1 ) FROM ( SELECT *, MIN(dt_from) OVER (/*PARTITION BY line_key*/ ORDER BY agreement_version desc,line_version desc) running_min_dt FROM siv where siv_is_actual AND prob > 0 ) t where t.dt_from=t.running_min_dt -- пытаюсь построить более эффективный расчет, нежели по каждой дате. По каждой дате сформулировать условия достаточно просто, но вычислений выходит очень много -- может попробовать повторить исходный расчет, но с оконными функциями (вместо подзапроса максимальной версии) -- вспомним, что проблема усложнилась, когда у нас не оказалось единой версии, а версия из 2 полей -- может быть, полезными окажутся какие-то ограничения, скажем, уникальность версии совместно с siv_is_actual (смутные воспоминания)