Retornar o próximo registro de data de um banco de dados
28/02/2014
0
Pessoal, bom dia!
Já queimei minha cabeça tentando resolver este problema, mas ainda não consegui, por isso peço ajuda de vocês. Tenho um banco relacional de registros de ligações, neste tenho todos os passos que uma ligação (CALLID) percorreu dentro de uma central de atendimento. Abaixo segue exemplo dos passos de uma ligação:
CALLID SEGSTART_DATE SEGSTOP_DATE DISPSPLIT TRANSFERRED UCID DISPVDN ANSLOGIN DAC_NODE_ID SkillAnteriorTransf SkillSeguinte DAC_NODE_ID_ANTERIOR DAC_NODE_ID_SEGUINTE
843264991 2014-01-26 15:36:26.000 2014-01-26 15:55:04.000 5 1 00021143691390761386 11912 44599 21 NULL 519 NULL 21
843264991 2014-01-26 15:37:32.000 2014-01-26 15:55:04.000 519 0 00021145291390761451 21313 55116 21 5 519 21 21
843264991 2014-01-26 15:42:58.000 2014-01-26 15:55:04.000 519 0 00021154011390761774 21301 59867 21 519 519 21 21
843264991 2014-01-26 15:44:13.000 2014-01-26 15:55:04.000 519 0 00021001751390761850 21301 59895 21 519 519 21 21
843264991 2014-01-26 15:44:35.000 2014-01-26 15:55:04.000 519 0 00021002391390761873 21301 50419 21 519 519 21 21
843264991 2014-01-26 15:44:52.000 2014-01-26 15:55:04.000 519 1 00021002751390761889 21301 58266 21 519 26 21 20
843264991 2014-01-26 15:52:40.000 2014-01-26 15:55:04.000 519 0 00021015471390762360 20067 NULL 21 NULL NULL NULL NULL
Tenho que montar os passos de uma chamada como se fosse um único registro, trazendo o SkillSeguinte para saber para onde ela foi transferida, para tanto fiz o seguinte código:
O problema é quando faço a comparação ECH_TRANSF_2.SEGSTART_DATE > ORIGEM.SEGSTART_DATE acabo retornando todos os registros com data maior do que o atual e faz um plano cartesiano. Preciso que retorne apenas o registro de data mais próximo, o seguinte, para que o join seja feito apenas com um registro.
Alguém sabe com posso resolver este problema?
Já queimei minha cabeça tentando resolver este problema, mas ainda não consegui, por isso peço ajuda de vocês. Tenho um banco relacional de registros de ligações, neste tenho todos os passos que uma ligação (CALLID) percorreu dentro de uma central de atendimento. Abaixo segue exemplo dos passos de uma ligação:
CALLID SEGSTART_DATE SEGSTOP_DATE DISPSPLIT TRANSFERRED UCID DISPVDN ANSLOGIN DAC_NODE_ID SkillAnteriorTransf SkillSeguinte DAC_NODE_ID_ANTERIOR DAC_NODE_ID_SEGUINTE
843264991 2014-01-26 15:36:26.000 2014-01-26 15:55:04.000 5 1 00021143691390761386 11912 44599 21 NULL 519 NULL 21
843264991 2014-01-26 15:37:32.000 2014-01-26 15:55:04.000 519 0 00021145291390761451 21313 55116 21 5 519 21 21
843264991 2014-01-26 15:42:58.000 2014-01-26 15:55:04.000 519 0 00021154011390761774 21301 59867 21 519 519 21 21
843264991 2014-01-26 15:44:13.000 2014-01-26 15:55:04.000 519 0 00021001751390761850 21301 59895 21 519 519 21 21
843264991 2014-01-26 15:44:35.000 2014-01-26 15:55:04.000 519 0 00021002391390761873 21301 50419 21 519 519 21 21
843264991 2014-01-26 15:44:52.000 2014-01-26 15:55:04.000 519 1 00021002751390761889 21301 58266 21 519 26 21 20
843264991 2014-01-26 15:52:40.000 2014-01-26 15:55:04.000 519 0 00021015471390762360 20067 NULL 21 NULL NULL NULL NULL
Tenho que montar os passos de uma chamada como se fosse um único registro, trazendo o SkillSeguinte para saber para onde ela foi transferida, para tanto fiz o seguinte código:
SELECT DISTINCT ORIGEM.CALLID ,DATA_CHAMADA = ORIGEM.SEGSTOP_DATE ,COD_SKILL = ORIGEM.DISPSPLIT ,COD_DAC = ORIGEM.DAC_NODE_ID ,COD_SKILL_TRANSF_1 = ORIGEM.SkillSeguinte ,COD_DAC_TRANSF_1 = ORIGEM.DAC_NODE_ID_SEGUINTE ,COD_SKILL_TRANSF_2 = ECH_TRANSF_2.SkillSeguinte ,COD_DAC_TRANSF_2 = ECH_TRANSF_2.DAC_NODE_ID_SEGUINTE ,COD_SKILL_TRANSF_3 = ECH_TRANSF_3.SkillSeguinte ,COD_DAC_TRANSF_3 = ECH_TRANSF_3.DAC_NODE_ID_SEGUINTE ,COD_SKILL_TRANSF_4 = ECH_TRANSF_4.SkillSeguinte ,COD_DAC_TRANSF_4 = ECH_TRANSF_4.DAC_NODE_ID_SEGUINTE FROM #ORIGEM ORIGEM WITH(NOLOCK) LEFT JOIN #ORIGEM ECH_TRANSF_2 WITH(NOLOCK) ON ORIGEM.CALLID = ECH_TRANSF_2.CALLID AND ECH_TRANSF_2.TRANSFERRED = 1 AND ORIGEM.DAC_NODE_ID_SEGUINTE = ECH_TRANSF_2.DAC_NODE_ID_ANTERIOR AND ORIGEM.SkillSeguinte = ECH_TRANSF_2.SkillAnteriorTransf AND ECH_TRANSF_2.SEGSTART_DATE > ORIGEM.SEGSTART_DATE LEFT JOIN #ORIGEM ECH_TRANSF_3 WITH(NOLOCK) ON ECH_TRANSF_2.CALLID = ECH_TRANSF_3.CALLID AND ECH_TRANSF_3.TRANSFERRED = 1 AND ECH_TRANSF_2.DAC_NODE_ID_SEGUINTE = ECH_TRANSF_3.DAC_NODE_ID_ANTERIOR AND ECH_TRANSF_2.SkillSeguinte = ECH_TRANSF_3.SkillAnteriorTransf AND ECH_TRANSF_3.SEGSTART_DATE > ECH_TRANSF_2.SEGSTART_DATE LEFT JOIN #ORIGEM ECH_TRANSF_4 WITH(NOLOCK) ON ECH_TRANSF_3.CALLID = ECH_TRANSF_4.CALLID AND ECH_TRANSF_4.TRANSFERRED = 1 AND ECH_TRANSF_3.DAC_NODE_ID_SEGUINTE = ECH_TRANSF_4.DAC_NODE_ID_ANTERIOR AND ECH_TRANSF_3.SkillSeguinte = ECH_TRANSF_4.SkillAnteriorTransf AND ECH_TRANSF_4.SEGSTART_DATE > ECH_TRANSF_3.SEGSTART_DATE
O problema é quando faço a comparação ECH_TRANSF_2.SEGSTART_DATE > ORIGEM.SEGSTART_DATE acabo retornando todos os registros com data maior do que o atual e faz um plano cartesiano. Preciso que retorne apenas o registro de data mais próximo, o seguinte, para que o join seja feito apenas com um registro.
Alguém sabe com posso resolver este problema?
Jefferson Monteiro
Curtir tópico
+ 0
Responder
Posts
28/02/2014
Fabiano Carvalho
Não entendi muito bem o que precisa.
Mas pensou em criar query aninhada? Nessa query retornaria somente esse valor que deseja utilizar, e ai voce faz com que essa query seja um source.
Mas pensou em criar query aninhada? Nessa query retornaria somente esse valor que deseja utilizar, e ai voce faz com que essa query seja um source.
Responder
28/02/2014
Isaac Jose
bom dia a todos..
não consegui entender direito ... como sempre rsr...
mais acho que se vc fizer o select trazendo primeiro somente o registro que vc quer jogar ele e uma variável e dai por diante jogar ele na sua query deve funcionar...
não consegui entender direito ... como sempre rsr...
mais acho que se vc fizer o select trazendo primeiro somente o registro que vc quer jogar ele e uma variável e dai por diante jogar ele na sua query deve funcionar...
Responder
Clique aqui para fazer login e interagir na Comunidade :)