Tout a commencé avec l'écran suivant du groupe Whatsap avec le contenu suivant (l'original n'est pas en russe, mais cela n'a pas d'importance):
La somme des âges de Sasha, Petit et Viti est de 67 ans. Lorsque Victor était à l'âge de Sasha, il restait 3 ans de plus avant la naissance de Petit. Quelle est la somme des âges de Sasha et Petit?Il est clair que la tâche est pour les écoliers, mais après de longues heures de résolution de problèmes SQL-EX (en passant, merci à eux pour des tâches de haute qualité et intéressantes), la première chose qui me vient à l'esprit est:
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
Onglet où se trouve une tablette d'environ 100 lignes Solution: 32, à laquelle le collègue du groupe a répondu: "Et combien individuellement?" Nous supprimons DISTINCT et changeons "+" en "," ... il s'avère que 31 paires d'options ... pas tout à fait une réponse exacte. Pour une raison quelconque, je voulais répondre avec certitude et avoir au moins quelques preuves en main.
Alors. Nous prenons tous les clients disponibles dans la base de données à portée de main avec les noms de la tâche et leurs anniversaires:
WITH t AS (SELECT DISTINCT upper(NAME) NAME, to_date(birthdate, 'RRRRMMDD') dob FROM clients WHERE upper(NAME) IN ('', '', ''))
Dans l'original, les noms sont différents, il est clair que la base de données contient des noms selon le passeport.Nous nous connectons trois fois et ajoutons les conditions selon lesquelles la somme des âges de Sasha et Petya est de 32 lorsque Vita a 35 ans:
SELECT v.dob vitya,
mais je n'ai pas pensé à calculer le nombre de clients à l'avance et, en fin de compte, très vain. Bien sûr, il y en avait beaucoup, et en les multipliant les uns par les autres, malgré même certaines conditions, on pouvait attendre le résultat pour toujours. D'une manière ou d'une autre, vous devez réduire le nombre de lignes, disons que nous ne laissons que des homonymes. Après avoir ajouté les conditions, le nombre d'options possibles s'est avéré être d'environ un demi-million. De plus, des conditions ont été ajoutées pour que l'âge ne puisse pas être négatif et il y avait une certaine confusion avec les dates de naissance le même jour, j'ai donc légèrement corrigé la précision. Mais il y a quand même eu beaucoup de résultats.
Déjà désabonné dans le groupe qu'il tentait de prouver quelque chose, mais rien n'en est sorti. Un des collègues a suggéré de ne rechercher que des clients avec un patronyme rare. Cela ne convenait plus aux conditions du problème, mais a jeté la pensée suivante.
Pourquoi les personnages de la tâche ne sont-ils pas frères? C'est-à-dire pas le fait que ce soit les frères, nous ne pouvons pas le vérifier, mais les homonymes avec le même patronyme - c'est facile. Peut-être qu'il n'y en a pas dans la base de données, c'était un peu effrayant, mais après avoir ajouté la condition, la demande a encore émis 13 000 options possibles.
Réalisant que je perdais mon temps sur toutes sortes de bêtises inutiles, avant de tout quitter, j'ai décidé de vérifier mes noms de famille et mon patronyme. Et voilà, avec les noms de famille, il n'y a pas de problèmes, mais au lieu d'un deuxième prénom sur les pages interminables de l'échantillon, il y avait des tirets. C'est-à-dire la demande ne laissait essentiellement que les clients dont le deuxième prénom n'était pas connu. En ajoutant simplement la dernière condition, je n'ai obtenu que 3 entrées. Cet écran avec les mots "il est peu probable que la tâche ait été formulée dans les années 50, et si vous ne quittez que 2001, alors les Frères étaient 35, 3, 29"
Bien sûr, tout cela est très arbitraire, et pour plaisanter, il n'est pas nécessaire de tout prendre au sérieux. S'amusant comme nous pouvons, nous sommes programmeurs ...