Wir lösen ein logisches Problem für Studenten in SQL

Alles begann mit dem nächsten Bildschirm in der Whatsap-Gruppe mit folgendem Inhalt (das Original ist nicht auf Russisch, aber es spielt keine Rolle):

Die Summe der Altersstufen von Sasha, Petit und Viti beträgt 67 Jahre. Als Victor im Alter von Sasha war, blieben noch 3 Jahre bis zur Geburt von Petit. Was ist die Summe der Zeitalter von Sasha und Petit?

Es ist klar, dass die Aufgabe für Schulkinder ist, aber nach langen Stunden der Lösung von SQL-EX-Problemen (übrigens dank ihnen für hochwertige und interessante Aufgaben) fällt mir als Erstes Folgendes ein:

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

Wo die Registerkarte jede Tafel mit der Anzahl der Zeilen etwa 100. Die Lösung ist: 32, auf denen die Gruppe Kollegen antworteten: „A trennen sie um wie viel?“. Wir entfernen DISTINCT und ändern "+" in "," ... es stellt sich heraus, dass 31 Optionspaare ... keine ganz genaue Antwort sind. Aus irgendeinem Grund wollte ich sicher antworten und zumindest einige Beweise zur Hand haben.

Also. Wir nehmen alle verfügbaren Kunden in der Datenbank mit den Namen der Aufgabe und ihren Geburtstagen zur Hand:

WITH t AS
 (SELECT DISTINCT upper(NAME) NAME,
                  to_date(birthdate, 'RRRRMMDD') dob
    FROM clients
   WHERE upper(NAME) IN ('САША', 'ПЕТЯ', 'ВИТЯ'))

Im Original sind die Namen unterschiedlich, es ist klar, dass die Datenbank Namen entsprechend dem Reisepass enthält.
Wir verbinden uns dreimal und addieren die Bedingungen, dass die Summe des Alters von Sasha und Petya 32 ist, wenn Vita 35 ist:

SELECT    v.dob vitya,             --дни рождения реальных Вити, Саши и Пети
               s.dob sasha,
               p.dob petya,
               add_months(v.dob, 35 * 12) data_zadachi -- Предположительная дата рождения задачи)
          FROM t v
         CROSS JOIN t s
         CROSS JOIN t p
         WHERE v.name = 'ВИТЯ'
               AND s.name = 'САША'
               AND p.name = 'ПЕТЯ'
               AND trunc((add_months(v.dob, 35 * 12) - s.dob) / 365.24) +
               trunc((add_months(v.dob, 35 * 12) - p.dob) / 365.24) = 32

Aber ich habe nicht daran gedacht, die Anzahl der Kunden im Voraus zu berechnen, und wie sich herausstellte, sehr vergeblich. Natürlich gab es viele von ihnen, und wenn man sich gegenseitig multipliziert, konnte man trotz einiger Umstände ewig auf das Ergebnis warten. Irgendwie müssen Sie die Anzahl der Zeilen reduzieren. Nehmen wir an, wir lassen nur Namensvetter. Nach dem Hinzufügen der Bedingungen stellte sich heraus, dass die Anzahl der möglichen Optionen etwa eine halbe Million betrug. Außerdem wurden Bedingungen hinzugefügt, dass das Alter nicht negativ sein kann, und es gab einige Verwechslungen mit den Geburtsdaten am selben Tag, so dass ich die Genauigkeit leicht korrigierte. Trotzdem gab es viele Ergebnisse.

Bereits in der Gruppe abgemeldet, dass er versuchte, etwas zu beweisen, aber nichts kam dabei heraus. Einer der Kollegen schlug vor, nur Kunden mit einem seltenen Patronym zu suchen. Dies entsprach nicht mehr den Bedingungen des Problems, warf aber den folgenden Gedanken auf.

Warum sind die Charaktere der Aufgabe keine Brüder? Das heißt, Nicht die Tatsache, dass es die Brüder sind, können wir nicht überprüfen, sondern Namensvetter mit demselben Patronym - das ist einfach. Vielleicht gibt es keine in der Datenbank, es war ein wenig beängstigend, aber nach dem Hinzufügen der Bedingung gab die Anfrage immer noch 13.000 mögliche Optionen aus.

Als ich merkte, dass ich meine Zeit mit allerlei nutzlosem Unsinn verschwendete, bevor ich alles verließ, beschloss ich, meine Nachnamen und mein Patronym zu überprüfen. Und hier ist es, mit Nachnamen gibt es keine Probleme, aber anstelle eines zweiten Vornamens auf den endlosen Seiten des Beispiels gab es Bindestriche. Das heißt, Die Anfrage ließ im Grunde nur diejenigen Kunden zurück, deren zweiter Vorname nicht bekannt war. Durch einfaches Hinzufügen der letzten Bedingung erhielt ich nur 3 Einträge. Dieser Bildschirm mit den Worten "Es ist unwahrscheinlich, dass die Aufgabe in den 50er Jahren formuliert wurde, und wenn Sie nur 2001 verlassen, dann waren die Brüder 35, 3, 29".

Natürlich ist das alles sehr willkürlich, und um eines Witzes willen ist es nicht notwendig, alles ernst zu nehmen. Wir haben so viel Spaß wie möglich und sind Programmierer ...

Jetzt auch beliebt: