Todo comenzó con la siguiente pantalla en el grupo de Whatsap con el siguiente contenido (el original no está en ruso, pero no importa):
La suma de las edades de Sasha, Petit y Viti tiene 67 años. Cuando Victor tenía la edad de Sasha, quedaban 3 años más antes del nacimiento de Petit. ¿Cuál es la suma de las edades de Sasha y Petit?Está claro que la tarea es para escolares, pero después de largas horas de resolución de problemas SQL-EX (por cierto, gracias a ellos por tareas interesantes y de alta calidad) lo primero que viene a la mente es:
SELECT DISTINCT r2 + r3 FROM (SELECT rownum r1 FROM tab) r1 CROSS JOIN (SELECT rownum r2 FROM tab) r2 CROSS JOIN (SELECT rownum r3 FROM tab) r3 WHERE r1 + r2 + r3 = 67 AND r1 - r2 = r3 + 3
Donde
tab es cualquier tableta con aproximadamente 100 líneas Solución: 32, a lo que el colega del grupo respondió: "¿Y cuántas individualmente?" Eliminamos DISTINCT y cambiamos "+" a "," ... resulta que 31 pares de opciones ... no es una respuesta exacta. Por alguna razón, quería responder con seguridad, y tener al menos alguna evidencia a mano.
Entonces Tomamos todos los clientes disponibles en la base de datos a la mano con los nombres de la tarea y sus cumpleaños:
WITH t AS (SELECT DISTINCT upper(NAME) NAME, to_date(birthdate, 'RRRRMMDD') dob FROM clients WHERE upper(NAME) IN ('', '', ''))
En el original, los nombres son diferentes, está claro que la base de datos contiene nombres de acuerdo con el pasaporte.Nos conectamos tres veces y agregamos las condiciones de que la suma de las edades de Sasha y Petya es 32 cuando Vita tiene 35 años:
SELECT v.dob vitya,
pero no pensé en calcular el número de clientes por adelantado, y resultó ser muy vano. Por supuesto, había muchos de ellos, y multiplicándolos uno por el otro, a pesar de alguna condición, uno podría esperar el resultado para siempre. De alguna manera, necesita reducir el número de líneas, digamos que dejamos solo los mismos nombres. Después de agregar las condiciones, el número de opciones posibles resultó ser de aproximadamente medio millón. Además, se agregaron condiciones de que la edad no puede ser negativa, y hubo cierta confusión con las fechas de nacimiento el mismo día, por lo que corregí un poco la precisión. Pero aún así hubo muchos resultados.
Ya no estaba suscrito en el grupo que estaba tratando de probar algo, pero no salió nada. Uno de los colegas sugirió buscar solo clientes con un patronímico raro. Esto ya no se ajustaba a las condiciones del problema, pero arrojó el siguiente pensamiento.
¿Por qué los personajes de la tarea no son hermanos? Es decir No es el hecho de que sean los hermanos, no podemos verificar esto, pero los homónimos con el mismo patronímico, esto es fácil. Quizás no haya ninguno en la base de datos, fue un poco aterrador, pero después de agregar la condición, la solicitud aún emitió 13,000 opciones posibles.
Al darme cuenta de que estaba perdiendo el tiempo en todo tipo de tonterías inútiles, antes de dejar todo, decidí verificar mis apellidos y mi patronímico. Y aquí está, con los apellidos no hay problemas, pero en lugar de un segundo nombre en las páginas interminables de la muestra, aparecen guiones. Es decir la solicitud básicamente dejó solo a aquellos clientes cuyos segundos nombres no se conocían. Simplemente agregando la última condición, obtuve solo 3 entradas. Esta pantalla con las palabras "es poco probable que la tarea se formule en los años 50, y si abandonas solo 2001, entonces los Hermanos tenían 35, 3, 29"
Por supuesto, todo esto es muy arbitrario, y por el bien de una broma, no es necesario tomar todo en serio. Divirtiéndonos como podemos, somos programadores ...