Мне нужно соединить таблицу A и таблицу B, чтобы создать таблицу C.Сопоставление перекрывающихся диапазонов дат
Таблица A и таблица B сохраняют флаги состояния для идентификаторов. Флаги состояния (A_Flag и B_Flag) могут время от времени меняться, поэтому один ID может содержать несколько строк, которые представляют историю статусов идентификатора. Флаги для определенного идентификатора могут изменяться независимо друг от друга, что может привести к тому, что одна строка в таблице А будет принадлежать нескольким строкам в таблице B и наоборот.
Результирующая таблица (таблица C) должна быть списком уникальных диапазонов дат, охватывающих каждую дату жизни ID (01/01/2008-18/08/2008) и значения A_Flag и B_Flag для каждого диапазона дат ,
Фактические таблицы содержат сотни идентификаторов с каждым идентификатором, имеющим различное количество строк в таблице.
У меня есть доступ к инструментам SQL и SAS для достижения конечного результата.
Source - Table A
ID Start End A_Flag
1 01/01/2008 23/03/2008 1
1 23/03/2008 15/06/2008 0
1 15/06/2008 18/08/2008 1
Source - Table B
ID Start End B_Flag
1 19/01/2008 17/02/2008 1
1 17/02/2008 15/06/2008 0
1 15/06/2008 18/08/2008 1
Result - Table C
ID Start End A_Flag B_Flag
1 01/01/2008 19/01/2008 1 0
1 19/01/2008 17/02/2008 1 1
1 17/02/2008 23/03/2008 1 0
1 23/03/2008 15/06/2008 0 0
1 15/06/2008 18/08/2008 1 1
Я не могу придумать способ сделать это только с помощью стандартного SQL, и я не знаю SAS. Если бы я знал, какой вкус, я должен был бы написать процедуру, которая будет работать. – pahoughton
Несколько ответов имеют правильное решение и совпадают с тем, что я использовал в прошлом: вам нужно определить все даты, когда что-то происходит, и из них определяют все диапазоны между этими датами. Затем присоединитесь к этому полному набору диапазонов обратно к исходным таблицам, чтобы определить атрибуты, действительные для данного диапазона дат. Для этого вам не нужна функция LAG, но здесь очень удобно использовать общее табличное выражение (с предложением). –