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 ?
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 ?
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;
PARTITION BY
indica que a numeração será feita considerando a combinação dos valores dos campos nome
e sobrenome
. 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:
id | nome | sobrenome | duplicata |
---|---|---|---|
1 | João | Silva | 1 |
3 | João | Silva | 2 |
4 | João | Silva | 3 |
2 | Maria | Santos | 1 |
6 | Maria | Santos | 2 |
5 | Pedro | Oliveira | 1 |
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!