1
resposta

Pular registros!

Olá!

Já que com o OFFSET saltamos um determinado números de registros, qual seria o comando para contar registros pares ou ímpares , de 2 em 2 ou de 3 em 3?

1 resposta

Oi, Helon! Tudo bem?

Peço desculpas pela demora em retornar.

Para entender como podemos desenvolver scripts SQL capazes de pular determinados registros através de uma lógica específica, irei seguir esta sequência: apresentar o código e, logo em seguida, explicar o seu funcionamento. Vamos nessa?

Durante todos os exemplos, teremos como base a tabela aluno criada durante o curso!

1 - Apresentação de registros cujo id é um número par

SELECT id, nome FROM aluno
WHERE id % 2 = 0;
  • Inicialmente, estamos definido que, na visualização, serão apresentados apenas o id e o nome dos alunos;
  • A partir do WHERE, filtramos apenas os registros cujo resto da divisão por 2 é igual a 0 (indicando que se trata de um número par). Esse processo é possível, pois utilizamos o símbolo de porcentagem, que coleta o módulo de uma divisão.

2 - Apresentação de registros cujo id é um número ímpar

Para isso, seguiremos uma ideia parecida da anterior:

SELECT id, nome FROM aluno
WHERE id % 2 = 1;
  • Nesse caso, a partir do WHERE filtramos apenas os registros cujo resto da divisão por 2 é igual a 1 (indicando que se trata de um número ímpar).

3 - Apresentação de registros de 2 em 2

SELECT id, nome
FROM (
  SELECT id, nome, row_number() OVER (ORDER BY id) AS numero_linha
  FROM aluno
) subconsulta
WHERE (numero_linha -1) % 4 < 2;

Helon, no script SQL acima, estamos trabalhando com subconsultas. Caso você não esteja familiarizado com esse recurso, não se preocupe, pois ao longo dos nossos estudos iremos conhecendo cada vez mais o que o SQL nos proporciona. De maneira geral, estamos realizando as seguintes coisas:

  • Criando uma consulta que, além de ter as colunas id e nome, também terá uma coluna chamada numero_linha, por meio dela iremos obter o número de cada linha da nossa tabela. Isso é possível, haja vista que utilizamos a função row_number e ordenamos tais valores a partir da coluna id da tabela aluno. Toda essa consulta recebeu, em nosso script, o nome de subconsulta;
  • Com isso, iremos criar uma nova consulta que irá coletar informações da nossa subconsulta. Será justamente ela que aparecerá na tela após a execução do script;
  • Por fim, usamos a cláusula WHERE para filtrar os registros de 2 em 2. Primeiro, recebemos o valor de uma linha e subtraímos 1 dela; após isso, obtemos o módulo da sua divisão por 4; no final, comparamos se o resultado obtido é inferior a 2.

Helon, nesse script, a lógica por trás do filtro e os valores usados para tal consideram a quantidade de registros a serem pulados. Observe a tabela abaixo para entender melhor:

idnome
1Ana
2Bruno
3Carla
4Diego
5Elena
6Fábio

Pulando de dois em dois, teríamos o seguinte resultado:

idnome
1Ana
2Bruno
5Elena
6Fábio

Note que os alunos com id 3 e 4 não apaceram, uma vez que eles não cumprem o critério exigido pelo filtro. As linhas 3 e 4, quando tem seu número subtraído em uma unidade e coleta-se o módulo da sua divisão por 4, resultarão em um valor maior ou igual a 2.

4 - Apresentação de registros de 3 em 3

Para isso, seguiremos a mesma lógica do item 3, a única diferença será nos valores usados no filtro, observe:

SELECT id, nome
FROM (
  SELECT id, nome, row_number() OVER (ORDER BY id) AS numero_linha
  FROM aluno
) subconsulta
WHERE (numero_linha -1) % 6 < 3;
  • Para apresentar os registros de 3 em 3, filtramos os dados que, ao diminuir 1 de numero_linha, dividir o resultado da subtração por 6 e obter o seu módulo, encontram-se valores menores que 3.

Em uma tabela, chegaríamos em algo assim:

idnome
1Ana
2Bruno
3Carla

Nossa tabela original tinha 6 registros, mas, ao usar o script que apresenta dados de 3 em 3, foi possível observar somente os alunos de id 1, 2 e 3!

Helon, espero ter ajudado! Caso surja alguma dúvida após a minha explicação, estarei aqui para conversarmos sobre isso!

Um forte abraço.

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