Eu não consigo fazer isso funcionar da maneira que eu preciso. Eu tenho duas tabelas Assignment
e Event
.
Assignment
StartDate EndDate Equipment
4/1/2016 4/23/2016 1001
4/3/2016 4/10/2016 1002
3/30/2016 4/20/2016 1003
Event
StartDate EndDate Equipment Event
4/2/2016 4/3/2016 1001 maintenance
4/8/2016 4/10/2016 1001 maintenance
4/4/2016 4/5/2016 1002 maintenance
Preciso juntar no equipamento e ter uma saída que divida o Assignment usando os eventos. Para esses dados de amostra, eu teria uma saída parecida com esta:
StartDate EndDate Equipment EventStatus
4/1/2016 4/2/2016 1001 Active
4/2/2016 4/3/2016 1001 maintenance
4/3/2016 4/8/2016 1001 Active
4/8/2016 4/10/2016 1001 maintenance
4/10/2016 4/23/2016 1001 Active
4/3/2016 4/4/2016 1002 Active
4/4/2016 4/5/2016 1002 maintenance
4/5/2016 4/10/2016 1002 Active
3/30/2016 4/20/2016 1003 Active
Assim, para o equipamento número 1001; foi colocado em uma atribuição e teve manutenção duas vezes. Essa manutenção dividiu a tarefa em 5 partes da seguinte forma:
---------------------------------------------------------------------
| Active |maintenance| Active |maintenance| Active |
---------------------------------------------------------------------
Cada uma dessas partes deve ter sua própria linha com a data de início e término dessa seção. Como posso escrever uma consulta para fazer isso funcionar?
Outra solução possível: (obrigado John Eisbrener pelos dados de amostra)
Isso é um pouco desajeitado, pois não consegui fazer uma função de janelamento (ou seja , DENSE_RANK , NTILE , RANK ou ROW_NUMBER ) funcionar como eu esperava, então tive que "projetar" uma via COALESCE e algumas personalizações na estrutura da tabela.
A premissa básica aqui é que primeiro você precisa unir essas tabelas a uma tabela intermediária que contém uma lista de todos os dias (por exemplo, uma tabela adicional que criei, chamada #tmpDates). Essa é a base para a saída do relatório, pois agruparemos os registros para obter a saída especificada. Em seguida, trabalhamos na função de janela personalizada (usando COALESCE aqui) para que as etapas entre os dias de "manutenção" e os dias normais sejam enumeradas, mas para que funcione corretamente, tive que definir um campo de identificação na tabela de eventos com um valor de incremento de salto .
O código em toda a sua glória horrenda está abaixo. Se você tiver dúvidas, me avise e farei o possível para esclarecer, mas isso é lixo ... lixo de trabalho. Espero que alguém consiga fazer isso funcionar com uma função de classificação em vez do meu horrível festival de hack-and-slash com COALESCE: