1
resposta

[Dúvida] Numerar registros conforme entrada de dados

gostaria de uma instrução SQL que numere os duplicados conforme vão entrando, isso indicaria que por exemplo, seria a 2º vez que o registro aparece na minha tabela.

é possivel ?

1 resposta

Oi, Marlon, tudo bem?

Peço desculpas pela demora em retornar.

Sim, é possível numerar registros duplicados na sua tabela conforme eles vão entrando. Para isso, você pode utilizar a função ROW_NUMBER() do MySQL!

A função ROW_NUMBER() atribui um número sequencial a cada linha de um conjunto de resultados de uma consulta SQL. Essa função pode ser utilizada, por exemplo, para numerar registros duplicados.

Para exemplificar, vamos criar uma tabela de teste e inserir alguns registros duplicados:

CREATE TABLE exemplo (
  id INT NOT NULL AUTO_INCREMENT,
  nome VARCHAR(50),
  sobrenome VARCHAR(50),
  PRIMARY KEY (id)
);

INSERT INTO exemplo (nome, sobrenome) VALUES ('João', 'Silva');
INSERT INTO exemplo (nome, sobrenome) VALUES ('Maria', 'Santos');
INSERT INTO exemplo (nome, sobrenome) VALUES ('João', 'Silva');
INSERT INTO exemplo (nome, sobrenome) VALUES ('João', 'Silva');
INSERT INTO exemplo (nome, sobrenome) VALUES ('Pedro', 'Oliveira');
INSERT INTO exemplo (nome, sobrenome) VALUES ('Maria', 'Santos');

Observe que, durante a inserção dos dados, adicionamos três pessoas chamadas "João Silva" e duas "Maria Santos". Sabendo disso, podemos construir então a consulta que apresenta as duplicatas:

SELECT id, nome, sobrenome, 
  ROW_NUMBER() OVER (PARTITION BY nome, sobrenome ORDER BY id) AS duplicata
FROM exemplo;
  • A cláusula PARTITION BY indica que a numeração será feita considerando a combinação dos valores dos campos nome e sobrenome.
  • A cláusula ORDER BY indica a ordem de numeração, que será baseada no campo id.
  • ROW_NUMBER() é a função que retornará um número sequencial para cada linha dentro de um grupo definido pela cláusula OVER;
  • OVER é uma cláusula que define a janela de análise da função ROW_NUMBER(). Neste caso em específico, a "janela" será os valores dos campos nome e sobrenome, ordenados pelo id, da tabela exemplo.

A partir desse SELECT, teremos o seguinte resultado:

idnomesobrenomeduplicata
1JoãoSilva1
3JoãoSilva2
4JoãoSilva3
2MariaSantos1
6MariaSantos2
5PedroOliveira1

Olha só! Agora temos uma tabela com todos os registros (duplicados ou não) enumerados conforme a ordem em que foram inseridos!

Marlon, de maneira geral, você pode reorganizar o SELECT que construímos para o que você precisa, sempre analisando coisas como nome da tabela e campos que devem ser levados em consideração para decidir se uma linha está duplicada ou não.

Caso o valor do campo duplicata seja igual a 1, significa dizer que este foi o primeiro registro inserido e, portanto, não haviam outros dados iguais a ele.

Espero ter ajudado. Fico à disposição em caso de dúvidas.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!