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 ?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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!