Потерянная запись из-за коллапса версий - PullRequest
0 голосов
/ 05 марта 2020

есть две таблицы. Вы должны подключить их при сохранении версий. Таблица "ft":

| id | param1 | param2 |          dfrom        |           dto         |
|----|--------|--------|-----------------------|-----------------------|
|  1 |  'SS'  |  'DD'  | '01.04.2010 12:30:20' | '17.04.2010 13:10:14' |
|  1 |  'ZZ'  |  null  | '17.04.2010 13:10:15' | '18.01.2010 04:13:15' |
|  1 |  'ZZ'  |  'GG'  | '18.01.2010 04:13:16' | '12.12.2010 00:00:00' |

Таблица "st":

| id | param3 |          dfrom        |           dto         |
|----|--------|-----------------------|-----------------------|
|  1 |  'KK'  | '01.03.2010 12:30:20' | '02.04.2010 13:10:14' |
|  1 |  'QQ'  | '02.04.2010 13:10:15' | '12.12.2010 00:00:00' |

Результат:

| id | param1 | param2 | param3 |          dfrom        |            dto        |
|  1 |  'ZZ'  |  'DD'  |  'QQ'  | '18.01.2010 04:13:16' | '12.12.2010 00:00:00' |
|  1 |  null  |  null  |  'KK'  | '01.03.2010 12:30:20' | '01.04.2010 12:30:19' |
|  1 |  'SS'  |  'DD'  |  'KK'  | '01.04.2010 12:30:20' | '02.04.2010 13:10:14' |
|  1 |  'SS'  |  'DD'  |  'QQ'  | '02.04.2010 13:10:15' | '17.04.2010 13:10:14' |
|  1 |  'ZZ'  |  null  |  'QQ'  | '17.04.2010 13:10:15' | '18.01.2010 04:13:15' |

Я потерял 2 строки , Не могу понять, как учесть тот факт, что одна запись появилась раньше всех (dfrom), но закрылась в диапазоне двух других записей

1 Ответ

1 голос
/ 05 марта 2020

Как правило, вы хотите разделить данные по дате (и предположительно 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, но это кажется слишком большим предположением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...