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.
Continúan los patrones sobre STATION, ahora negando condiciones y combinándolas.
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 9
Query the list of CITY names from STATION that do not start with vowels. Your result cannot contain duplicates.
Teniendo la función LEFT es mucho más fácil ahora poder resolver este tipo de ejercicios. Ahora, usando el operador NOT, filtraremos las ciudades que no tengan vocales al inicio.
SELECT DISTINCT CITY FROM STATION
WHERE LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');| CITY |
|---|
| Baileyville |
| Bainbridge |
| Baker |
| Baldwin |
| Barrigada |
| Bass Harbor |
| Baton Rouge |
| Bayville |
| Beaufort |
Solución
... (resultado truncado, hay más filas)
Weather Observation Station 10
Query the list of CITY names from STATION that do not end with vowels. Your result cannot contain duplicates.
Solución
Solo debemos ahora hacerlo de forma invertida usando RIGHT
SELECT DISTINCT CITY FROM STATION
WHERE RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');| CITY |
|---|
| Kissee Mills |
| Loma Mar |
| Sandy Hook |
| Tipton |
| Arlington |
| Turner |
| Slidell |
| Negreet |
| Chignik Lagoon |
| Hanna City |
... (resultado truncado, hay más filas)
Weather Observation Station 11
Query the list of CITY names from STATION that either do not start with vowels or do not end with vowels. Your result cannot contain duplicates.
Solución
Ahora solamente debemos reutilizar la query anterior, en donde buscábamos palabras que coincidieran con una vocal en la primera letra Y coincidieran con la última letra con una vocal. Ahora, en vez de que ambas condiciones se den, solo con 1 basta, pero en este caso no deben tener ninguna vocal.
SELECT DISTINCT CITY FROM STATION
WHERE RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u')
OR LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');| CITY |
|---|
| Addison |
| Agency |
| Alanson |
| Albany |
| Albion |
| Algonac |
| Allerton |
| Alton |
| Andover |
| Anthony |
... (resultado truncado, hay más filas)
Weather Observation Station 12
Query the list of CITY names from STATION that do not start with vowels and do not end with vowels. Your result cannot contain duplicates.
Ahora si podemos usar AND en vez de OR
SELECT DISTINCT CITY FROM STATION
WHERE RIGHT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u')
OR LEFT(CITY, 1) NOT IN ('a', 'e', 'i', 'o', 'u');| CITY |
|---|
| Baker |
| Baldwin |
| Bass Harbor |
| Beaufort |
| Beaver Island |
| Benedict |
| Bennington |
| Berryton |
| Beverly |
| Bison |
| Blue River |
| Bowdon |
| Bowdon Junction |
| Bridgeport |
| Bridgton |
| Brighton |
Solución
... (resultado truncado, hay más filas)
Weather Observation Station 13
Query the sum of Northern Latitudes (LAT_N) from STATION having values greater than 38.7880 and less than 137.2345. Truncate your answer to 4 decimal places.
Solución
En este ejercicio nos piden sumar todas las latitudes del norte (LAT_N) que cumplan una condición, y luego truncar el resultado a 4 decimales. El orden correcto es: primero filtrar las latitudes que sean mayores a 38.7880 y menores a 137.2345 (usando los operadores > y <), y luego sumar esos valores con SUM. Finalmente, aplicamos TRUNCATE al total de la suma para quedarnos con 4 decimales sin redondear.
SELECT TRUNCATE(SUM(LAT_N), 4)
FROM STATION
WHERE LAT_N > 38.7880 AND LAT_N < 137.2345;Para que te des una idea de porque no volvemos a usar TRUNCATE aquí es por el orden de ejecución de la query
El orden lógico es el siguiente:
-
FROM → se identifica la tabla y se cargan las filas.
-
WHERE → se filtran las filas según la condición.
-
GROUP BY → se agrupan las filas (si aplica).
-
HAVING → se filtran los grupos (si aplica).
-
SELECT → se calculan las expresiones y se crean los alias.
-
ORDER BY → se ordena el resultado.
-
LIMIT → se limita el número de filas
Weather Observation Station 14
Query the greatest value of the Northern Latitudes (LAT_N) from STATION that is less than 137.2345. Truncate your answer to 4 decimal places.
Aplicando lo visto anteriormente en el ejercicio Weather Observation Station 14. Podremos resolver esto de manera muy sencilla.
Solución
SELECT TRUNCATE(MAX(LAT_N), 4) FROM Station WHERE LAT_N < 137.2345;Weather Observation Station 15
Query the Western Longitude (LONG_W) for the largest Northern Latitude (LAT_N) in STATION that is less than 137.2345. Round your answer to 4 decimal places.
Solución
Para obtener el valor máximo sin usar MAX, ordenamos la columna LAT_N de forma descendente (de mayor a menor) y limitamos el resultado a una sola fila con LIMIT 1. De esa fila tomamos el valor de LONG_W y lo redondeamos a 4 decimales.
SELECT ROUND(LONG_W, 4) FROM Station
WHERE LAT_N < 137.2345 ORDER BY LAT_N DESC LIMIT 1;Weather Observation Station 16
Query the smallest Northern Latitude (LAT_N) from STATION that is greater than 38.7780. Round your answer to 4 decimal places.
Solución
Así como tenemos MAX para obtener el valor máximo, contamos con la función MIN para obtener el valor mínimo entre todos los valores de LAT_N. En este caso, filtramos las latitudes mayores a 38.7780 con WHERE y luego aplicamos MIN para quedarnos con la más pequeña de ellas. Finalmente, redondeamos el resultado a 4 decimales.
SELECT ROUND(MIN(LAT_N), 4) FROM Station WHERE LAT_N > 38.7780;Weather Observation Station 17
Query the Western Longitude (LONG_W) where the smallest Northern Latitude (LAT_N) in STATION is greater than 38.7780. Round your answer to 4 decimal places.
Un poco de practica afianzando lo visto en Weather Observation Station 15
Solución
SELECT ROUND(LONG_W, 4) FROM Station
WHERE LAT_N > 38.7780 ORDER BY LAT_N LIMIT 1;