Contar Dados que Aparecem em Sequencia

22/05/2018

0

Prezados,
Boa noite

Estou com um problema para inserir um contador apenas quando um dado repetir em sequencia.
Conforme a imagem abaixo, o ID_ACAO 2 aparece pela primeira vez e o contador marca 1. Ao aparecer pela segunda vez, o contador recomeça a contar do 1 em diante e quando aparece pela terceira vez, também recomeça a contar. Isso deve ocorrer para todos os ID_ACAO.
Tentei usar ROW_NUMBER, DENSE_RANK, tentei verificar a linha anterior, linha posterior, mas não consegui montar um select para trazer o resultado abaixo.
Podem ajudar por gentileza?

TELEFONE DATA ID_ACAO CONTADOR
11996855200 01/01/2018 1 1
11996855200 02/01/2018 1 2
11996855200 03/01/2018 2 1 <- 1ª vez que o ID_ACAO 2 aparece
11996855200 04/01/2018 4 1
11996855200 05/01/2018 3 1
11996855200 06/01/2018 2 1 <- 2ª vez que o ID_ACAO 2 aparece
11996855200 07/01/2018 2 2
11996855200 08/01/2018 2 3
11996855200 09/01/2018 2 4
11996855200 10/01/2018 3 1
11996855200 11/01/2018 2 1
11996855200 12/01/2018 3 1
11996855200 13/01/2018 2 1 <- 3ª vez que o ID_ACAO 2 aparece
11996855200 14/01/2018 2 2
11996855202 01/01/2018 1 1
11996855202 02/01/2018 1 2
11996855202 03/01/2018 2 1
11996855202 04/01/2018 4 1
11996855202 05/01/2018 3 1
11996855202 06/01/2018 2 1
11996855202 07/01/2018 2 2
11996855202 08/01/2018 2 3
11996855202 09/01/2018 2 4
11996855202 10/01/2018 3 1
11996855202 11/01/2018 2 1
11996855202 12/01/2018 3 1
11996855202 13/01/2018 2 1
11996855202 14/01/2018 2 2
Leonardo Silva

Leonardo Silva

Responder

Post mais votado

23/05/2018

Fala Leonardo, pra isso vc pode usar o "case when"
( https://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-funcao-iif-no-t-sql/31292 )
caso o ID_ACAO igual a 2, vc pode usar um contador.

Bons estudos!

Diego Medeiros

Diego Medeiros
Responder

Mais Posts

23/05/2018

Emerson Nascimento

tente resolver com uma função. segue um exemplo:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION TRBTESTE()
RETURNS 
@TRB TABLE 
(
	TELEFONE VARCHAR(15),
	DATA DATE,
	ID_ACAO INT,
	CONTADOR INT
)
AS
BEGIN
	DECLARE @TELEFONE VARCHAR(15)
	DECLARE @TEL VARCHAR(15)
	DECLARE @DATA DATE
	DECLARE @ID_ACAO INT
	DECLARE @ACAO INT
	DECLARE @CONT INT

	DECLARE Listagem CURSOR LOCAL FOR
		SELECT TELEFONE, DATA, ID_ACAO
		FROM TARIFA T1
		ORDER BY TELEFONE, DATA, ID_ACAO

	OPEN Listagem
	FETCH NEXT FROM Listagem INTO @TELEFONE, @DATA, @ID_ACAO

	SET @CONT = 0
	WHILE (@@FETCH_STATUS=0)
	BEGIN
		SET @CONT = @CONT + 1
		SET @ACAO = @ID_ACAO
		SET @TEL = @TELEFONE

		INSERT INTO @TRB VALUES (@TELEFONE, @DATA, @ID_ACAO, @CONT)
		FETCH NEXT FROM Listagem INTO @TELEFONE, @DATA, @ID_ACAO
		IF (@ID_ACAO <> @ACAO) OR (@TEL <> @TELEFONE)
			SET @CONT = 0
	END

	CLOSE Listagem
	DEALLOCATE Listagem
	
	RETURN 
END
GO


sintaxe:
SELECT * FROM TRBTESTE()


ou

SELECT * FROM TRBTESTE()
WHERE DATA BETWEEN '01/01/2018' AND '10/01/2018'
 AND TELEFONE = '11996855200'


Responder

23/05/2018

Leonardo Silva

Emerson, muito obrigado. Resolveu meu problema.<br />
Abraço.
Responder

23/05/2018

Leonardo Silva

Diego, muito obrigado pelo auxilio.
Abraço.
Responder

25/05/2018

Diego Medeiros

vlw irmão grande abraço!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar