Estou usando o SQL Server 2016
Eu tenho uma tabela que contém 1 linha por mês que um paciente é atribuído a um determinado provedor.
Um paciente pode ser atribuído a vários provedores durante o ano.
Como posso derivar intervalos de datas (data de início e data de término) para representar a hora em que um paciente foi atribuído a cada provedor.
Minha tabela está assim:
+----------+---------------+------------+-----------+
| Provider | Patient | StartDate | EndDate |
+----------+---------------+------------+-----------+
| 1922157 | 12345 | 20191201 | 20191231 |
| 1904176 | 12345 | 20191101 | 20191201 |
| 1904176 | 12345 | 20191001 | 20191101 |
| 1904176 | 12345 | 20190901 | 20191001 |
| 1904176 | 12345 | 20190801 | 20190901 |
| 1904176 | 12345 | 20190701 | 20190801 |
| 1904176 | 12345 | 20190601 | 20190701 |
| 1904176 | 12345 | 20190501 | 20190601 |
| 1904176 | 12345 | 20190401 | 20190501 |
| 1904176 | 12345 | 20190301 | 20190401 |
| 1904176 | 12345 | 20190201 | 20190301 |
| 1922157 | 12345 | 20190101 | 20190201 |
| 1922157 | 56789 | 20190101 | 20190201 |
+----------+---------------+------------+-----------+
Neste caso, o paciente 12345 foi atribuído a 2 provedores diferentes. Um para 2 meses, janeiro e dezembro e outro para o resto do ano (10 meses) de fevereiro a novembro. O paciente 56789 foi atribuído apenas a 1 provedor (1922157) por 1 mês (em dezembro).
Estou tentando fazer com que minha saída se pareça com a tabela abaixo, mas estou tendo problemas, acho que porque o paciente é atribuído ao mesmo pcp durante 2 épocas diferentes do ano. Tentei usar a função lag, mas só obtenho os resultados corretos em alguns casos, mas não em todos, como neste caso em particular.
+----------+---------------+------------+-----------+
| Provider | Patient | StartDate | EndDate |
+----------+---------------+------------+-----------+
| 1922157 | 12345 | 20190101 | 20190201 |
| 1904176 | 12345 | 20190201 | 20191201 |
| 1922157 | 12345 | 20191201 | 20191231 |
| 1922157 | 56789 | 20191201 | 20191231 |
+----------+---------------+------------+-----------+
Atualização: estava fazendo mais algumas pesquisas e me deparei com o seguinte post:
https://stackoverflow.com/questions/35900765/ms-sql-combine-date-rows-into-start-end-date
Acabei de encaixar minha tabela no código na resposta para a pergunta acima e testei alguns dos meus casos e parece que pode fazer o trabalho. Infelizmente, minha tabela base tem 140 mil linhas de datas que precisarão ser calculadas, então não tenho certeza de quanto tempo levará para ser executada. Está funcionando agora por 6 minutos, vou postar de volta com os resultados.
Acho que entendi o que você está tentando fazer. Você está tentando obter a data de início e a data de término de um paciente em um provedor, desde que não haja intervalo entre as datas de início e término dos períodos. Criei uma tabela de teste com os dados amostrados.
A ideia é começar por ordenar os dados e tentar obter os que coincidem com as datas de início e de fim, de forma a detectar um furo nas datas. Eu faço isso com a função "ROW_NUMBER". Em seguida, encontro todas as linhas que correspondem e pego o primeiro StartDate e max EndDate para aqueles que correspondem e, em seguida, adiciono todas as linhas que estão "sozinhas" e não têm correspondência.
Eu acho que funciona com os dados que você forneceu. Não consegui testar com outros dados. A recursividade é outra opção para encontrar as datas Min/Max de valores diferentes, mas não usei recursividade neste caso. (fique à vontade para dar nomes melhores, fui um pouco rápido)
E aqui está o meu resultado.