none
Criar um ID de acordo com condições RRS feed

Respostas

  • Roberto,

    Bom dia!

    Caso a versão do SQL Server seja igual ou superior ao 2012, acho que isso pode te ajudar:

    --Identificando quebra
    Select	*
    		,Iif(DateDiff(Day, Lag(Data, 1, Data) Over(Order By IdPessoa), Data) Between -1 And 1, 0, 1) Quebra
    Into	#teste_2
    From	teste
    
    --Tabela de quebra auxiliar
    Select	IdPessoa
    		,Id	Inicio
    		,Lead(Id, 1, Null) Over(Order By IdPessoa) Fim
    		,Row_Number()	Over(Order By IdPessoa) + 1 IdPessoaData
    Into	#Quebras
    From	#teste_2
    Where	Quebra = 1
    
    --Ajustando ultima quebra
    Update	#Quebras
    Set		Fim = (Select	Max(Id) + 1 From	#teste_2 Where	Quebra = 0)
    Where	Fim Is Null
    
    --Resultado
    Select	t.Id	
    		,t.IdPessoa	
    		,t.Data
    		,Quebra
    		,Coalesce(q1.IdPessoaData, 1)	New_Id_Final
    From	#teste_2 t
    		Left Join #Quebras q1
    			On	t.Id >= q1.Inicio
    			And t.Id < q1.Fim
    Order By t.IdPessoa
    

    sexta-feira, 9 de fevereiro de 2018 11:57
  • Boa tarde,

    Roberto, segue uma sugestão para testes:

    with
        CTE_DifDias as
        (
            select
                *,
                DATEDIFF(DAY, '20000101', Data) as DifDias
            from teste
        ),
        
        CTE_DR as
        (
            select
                *,
                DENSE_RANK() OVER(PARTITION BY IdPessoa ORDER BY DifDias) as DR
            from CTE_DifDias
        )
    
    select
        Id,
        IdPessoa,
        Data,
        DENSE_RANK() OVER(ORDER BY IdPessoa, DifDias - DR) as IdPessoaData
    from CTE_DR

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Roberto Gaziola sexta-feira, 9 de fevereiro de 2018 19:06
    sexta-feira, 9 de fevereiro de 2018 16:31

Todas as Respostas

  • Roberto,

    Bom dia!

    Caso a versão do SQL Server seja igual ou superior ao 2012, acho que isso pode te ajudar:

    --Identificando quebra
    Select	*
    		,Iif(DateDiff(Day, Lag(Data, 1, Data) Over(Order By IdPessoa), Data) Between -1 And 1, 0, 1) Quebra
    Into	#teste_2
    From	teste
    
    --Tabela de quebra auxiliar
    Select	IdPessoa
    		,Id	Inicio
    		,Lead(Id, 1, Null) Over(Order By IdPessoa) Fim
    		,Row_Number()	Over(Order By IdPessoa) + 1 IdPessoaData
    Into	#Quebras
    From	#teste_2
    Where	Quebra = 1
    
    --Ajustando ultima quebra
    Update	#Quebras
    Set		Fim = (Select	Max(Id) + 1 From	#teste_2 Where	Quebra = 0)
    Where	Fim Is Null
    
    --Resultado
    Select	t.Id	
    		,t.IdPessoa	
    		,t.Data
    		,Quebra
    		,Coalesce(q1.IdPessoaData, 1)	New_Id_Final
    From	#teste_2 t
    		Left Join #Quebras q1
    			On	t.Id >= q1.Inicio
    			And t.Id < q1.Fim
    Order By t.IdPessoa
    

    sexta-feira, 9 de fevereiro de 2018 11:57
  • Boa tarde,

    Roberto, segue uma sugestão para testes:

    with
        CTE_DifDias as
        (
            select
                *,
                DATEDIFF(DAY, '20000101', Data) as DifDias
            from teste
        ),
        
        CTE_DR as
        (
            select
                *,
                DENSE_RANK() OVER(PARTITION BY IdPessoa ORDER BY DifDias) as DR
            from CTE_DifDias
        )
    
    select
        Id,
        IdPessoa,
        Data,
        DENSE_RANK() OVER(ORDER BY IdPessoa, DifDias - DR) as IdPessoaData
    from CTE_DR

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Roberto Gaziola sexta-feira, 9 de fevereiro de 2018 19:06
    sexta-feira, 9 de fevereiro de 2018 16:31
  • As duas funcionam...

    Obrigado.

    sexta-feira, 9 de fevereiro de 2018 19:07