Esta serie mantiene la mente fresca resolviendo, uno a uno, los ejercicios de HackerRank. Cada entrada toma un tema concreto y lo agota; todas las consultas están en MySQL salvo donde se indique.
Te invito a intentar cada ejercicio antes de leer la solución.
Los tres últimos ejercicios de STATION son los únicos donde hay que pensar en geometría antes que en SQL.
STATION
The STATION table is described as follows:
| Columna | Tipo |
|---|---|
| ID | NUMBER |
| CITY | VARCHAR2 |
| STATE | VARCHAR2 |
| LAT_N | NUMBER |
| LONG_W | NUMBER |
where LAT_N is the northern latitude and LONG_W is the western longitude.
Weather Observation Station 18
Consider P₁(a, b) and P₂(c, d) to be two points on a 2D plane.
-
a happens to equal the minimum value in Northern Latitude (LAT_N in STATION).
-
b happens to equal the minimum value in Western Longitude (LONG_W in STATION).
-
c happens to equal the maximum value in Northern Latitude (LAT_N in STATION).
-
d happens to equal the maximum value in Western Longitude (LONG_W in STATION).
Query the Manhattan Distance between points P₁ and P₂ and round it to a scale of 4 decimal places.
Aquí tienes la explicación completa de la fórmula de Manhattan, lista para copiar y pegar en Obsidian (con LaTeX):
La distancia Manhattan entre dos puntos y en un plano 2D se define como la suma de las diferencias absolutas de sus coordenadas:
De forma más general, para dos puntos y :
Solución
En el contexto de este ejercicio, los puntos se definen así:
Por lo tanto, la expresión final queda:
Y el resultado debe redondearse a 4 decimales:
Simplificando toda la expresión en la consulta e invirtiendo las restas para que no den negativo, quedaría así:
SELECT ROUND(((MAX(LAT_N)-MIN(LAT_N)) + (MAX(LONG_W)-MIN(LONG_W))), 4) FROM STATION;De esta forma, cada diferencia se calcula como mayor - menor, garantizando un valor positivo sin necesidad de usar ABS(). Luego sumamos ambas diferencias y redondeamos el resultado a 4 decimales con ROUND
Weather Observation Station 19
Consider P₁(a, c) and P₂(b, d) to be two points on a 2D plane where (a, b) are the respective minimum and maximum values of Northern Latitude (LAT_N) and (c, d) are the respective minimum and maximum values of Western Longitude (LONG_W) in STATION.
Query the Euclidean Distance between points P₁ and P₂ and format your answer to display 4 decimal digits.2
Solución
La distancia euclidiana es la distancia en línea recta entre dos puntos. Es la distancia "más corta" posible, como si trazaras una línea directa de un punto a otro con una regla. Es la que usamos intuitivamente cuando decimos "¿qué tan lejos está esto de aquello?".
Esto viene del teorema de Pitágoras. Si tienes dos puntos en un plano, puedes formar un triángulo rectángulo donde:
- Un cateto es la diferencia horizontal:
- El otro cateto es la diferencia vertical:
- La hipotenusa es la distancia entre los puntos:
→ diferencia entre latitudes.
→ diferencia entre longitudes.
SELECT ROUND(
SQRT(
POWER(MAX(LAT_N) - MIN(LAT_N), 2) +
POWER(MAX(LONG_W) - MIN(LONG_W), 2)
), 4)
FROM STATION;Weather Observation Station 20
A median is defined as a number separating the higher half of a data set from the lower half. Query the median of the Northern Latitudes (LAT_N) from STATION and round your answer to 4 decimal places.
Solución
Aquí tienes la explicación de la mediana siguiendo el mismo estilo que usaste para la media:
Según Khan Academy (s.f.), la mediana "es el número de en medio; se encuentra al ordenar todos los puntos de datos y elegir el que está en medio (o si hay dos números en medio, tomar la media de esos dos números)".
En Khan Academy podremos encontrar varios ejemplos.
Para calcular la mediana de LAT_N redondeada a 4 decimales. Como la tabla STATION tiene 499 filas (un número impar), la mediana es simplemente el valor que ocupa la posición central una vez ordenados los datos de menor a mayor. Para obtenerlo, ordenamos con ORDER BY LAT_N y usamos LIMIT 1 OFFSET 249: OFFSET 249 salta las primeras 249 filas (posiciones 1 a 249) y LIMIT 1 toma la siguiente, que es la posición 250, justo el medio. Finalmente, redondeamos con ROUND(..., 4).
SELECT ROUND(LAT_N, 4)
FROM STATION
ORDER BY LAT_N
LIMIT 1 OFFSET 249;