Array
(
)

Retornar o próximo registro de data de um banco de dados

Jefferson Monteiro
   - 28 fev 2014

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:
#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?

Faabiianooc
   - 28 fev 2014

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.

Isaac Jose
   - 28 fev 2014

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...