A solução era simples. Ele somou 1 com 100, depois 2 com 99, então 3 com 98 e assim por diante. Vindo pelas pontas, a soma é sempre 101 e depois de 50 somas, os números encontram-se em 50 e 51. O total, portanto, é 50 vezes 101.
Esse pequeno truque pode ser usado no SQL para encontrar sequências de números ou de datas. Considere os seguintes números: 1; 2; 3; 5; 6; 8; 9; e 10. Se cada um estiver numa linha de uma tabela, eu quero uma consulta que gere o seguinte resultado:
1 | 3 |
5 | 6 |
8 | 10 |
É necessária uma sequência decrescente para fazer o jogo com a nossa sequência crescente. Isso podemos resolver facilmente com funções analíticas. Na consulta abaixo, já somo cada número ao seu equivalente.
select n, n+row_number() over (order by n desc)
from numeros
order by n
Isso vai produzir as seguintes linhas:
1 | 9 |
2 | 9 |
3 | 9 |
5 | 10 |
6 | 10 |
8 | 11 |
9 | 11 |
10 | 11 |
E todos os números consecutivos compartilham o mesmo valor na segunda coluna. O que nos resta é agrupá-los e encontrar o máximo e mínimo de cada grupo. Assim, chegamos ao nosso objetivo:
select min(n), max(n) from (
select n, n+row_number() over (order by n desc) grupo
from numeros
)
group by grupo
order by 1
O resultado é, conforme esperado, este:
1 | 3 |
5 | 6 |
8 | 10 |
O mesmo pode ser feito com datas, basta tratar cada uma como o número de dias a partir da primeira data.