La suma de los N primeros números naturales es
S = (N+1)*N/2
Utilidad aplicada:
Supongamos un modelo de datos (una tabla) en el que hay un atributo para ordenar, un entero correlativo que empieza en 0. Para garantizar la coherencia de los datos, tenemos que asegurarnos que cada operación de modificación deja la tabla bien:
Aquí tenemos un ejemplo de datos coherentes:
+--------+-------+
| _order | id |
+--------+-------+
| 0 | 18685 |
| 1 | 21971 |
| 2 | 21979 |
| 3 | 21977 |
| 4 | 21975 |
| 5 | 21973 |
| 6 | 22047 |
+--------+-------+
Y aquí uno de datos no coherentes: se ha borrado un dato pero no se ha actualizado bien el _order en la tabla:
+--------+-------+
| _order | id |
+--------+-------+
| 0 | 18685 |
| 1 | 21971 |
| 2 | 21979 |
| 3 | 21977 |
| 4 | 21975 |
| 6 | 21973 |
| 7 | 22047 |
+--------+-------+
¿Cómo comprobar en una tabla estas incoherencias? Aquí entra en juego nuestra fórmula.
Si todo está bien, la suma de los _order + 1 debe ser igual a la suma de los n enteros hasta los N registros que tengamos en la tabla.
SELECT COUNT(id),
cliente,
SUM(_order+1) AS suma_order,
ROUND((COUNT(id)+1)*COUNT(id)/2, 0) AS suma_buena
FROM tabla
GROUP BY cliente
HAVING ROUND((COUNT(id)+1)*COUNT(id)/2, 0) != SUM(_order+1)
ORDER BY COUNT(id);