Contar Dados que Aparecem em Sequencia

SQL Server

22/05/2018

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

Curtidas 0

Melhor post

Diego Medeiros

Diego Medeiros

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!
GOSTEI 3

Mais Respostas

Emerson Nascimento

Emerson Nascimento

22/05/2018

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'


GOSTEI 3
Leonardo Silva

Leonardo Silva

22/05/2018

Emerson, muito obrigado. Resolveu meu problema.<br />
Abraço.
GOSTEI 0
Leonardo Silva

Leonardo Silva

22/05/2018

Diego, muito obrigado pelo auxilio.
Abraço.
GOSTEI 0
Diego Medeiros

Diego Medeiros

22/05/2018

vlw irmão grande abraço!
GOSTEI 0
POSTAR