looks like semi-working
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
with siv (id, dt_from, agreement_version, line_version, agreement_is_actual, siv_is_actual, cost, prob)
|
||||
as (VALUES
|
||||
(10,'2025-01-01'::date, 1, 1, true, true, 100, 100),
|
||||
(20,'2025-02-01', 1, 10, false, true, 200, 10),
|
||||
(30,'2025-02-01', 1, 12, true, true, 200, 100),
|
||||
(35,'2025-02-01', 1, 13, true, true, 250, 100),
|
||||
(40,'2025-03-01', 2, 20, true, true, 100, 100),
|
||||
(50,'2025-03-01', 2, 21, true, true, 150, 100),
|
||||
(60,'2025-02-15', 3, 30, true, true, 300, 100),
|
||||
(70,'2025-04-01', 4, 40, false, true, 100, 100),
|
||||
(80,'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,
|
||||
b.*
|
||||
|
||||
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
|
||||
LEFT OUTER JOIN
|
||||
( select * 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
|
||||
) i where i.dt_from=i.running_min_dt
|
||||
|
||||
) b on (b.id=(select id from
|
||||
( -- базовая лесенка
|
||||
SELECT id, dt_from, agreement_version, line_version,
|
||||
MIN(siv.dt_from) OVER (/*PARTITION BY line_key*/ ORDER BY siv.agreement_version desc,siv.line_version desc) running_min_dt
|
||||
FROM siv where siv_is_actual AND prob=100 AND agreement_is_actual
|
||||
) i where i.dt_from=i.running_min_dt
|
||||
AND i.dt_from < t.dt_from
|
||||
ORDER BY /*dt_from desc,*/ agreement_version desc, line_version desc
|
||||
LIMIT 1
|
||||
)) where t.dt_from=t.running_min_dt -- это условие формирования лесенки, очень оторвано от ее селекта
|
||||
|
||||
|
||||
-- пытаюсь построить более эффективный расчет, нежели по каждой дате. По каждой дате сформулировать условия достаточно просто, но вычислений выходит очень много
|
||||
-- может попробовать повторить исходный расчет, но с оконными функциями (вместо подзапроса максимальной версии)
|
||||
-- вспомним, что проблема усложнилась, когда у нас не оказалось единой версии, а версия из 2 полей
|
||||
-- может быть, полезными окажутся какие-то ограничения, скажем, уникальность версии совместно с siv_is_actual (смутные воспоминания)
|
||||
|
||||
Reference in New Issue
Block a user