Directorio de artículos
En el proceso de entrevistas de programadores de hoy, no es difícil examinar algunas habilidades de SQL, pero es casi obligatorio.
Para verificar los puntos ciegos del pensamiento y evitar zozobrar, también puede revisar la revisión. Si hay alguna ayuda para usted, bienvenido Dé un cumplido ~
pd: Desarrolladores de datos, se recomienda que pueda aumentar la dificultad para investigar por sí mismo
Dificultad de leetcode: media
Frecuencia de entrevistas: media
1. Temas
1.1 Tabla
Tabla de empleados:
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。
1.2 Requisitos
Escriba una consulta SQL para obtener y devolver el segundo salario más alto en la tabla Empleado. Si el segundo salario más alto no existe, la consulta debe devolver nulo.
El resultado de la consulta se muestra en el siguiente ejemplo.
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null |
+---------------------+
2. Análisis del sitio de prueba
solución de primer nivel
Esta pregunta es muy simple. Examina principalmente la aplicación de clasificación + límite + compensación. Muchos novatos pueden no estar familiarizados con la compensación de compensación, lo que dificulta comenzar.
segunda solucion
pasar
solución de tercer nivel
pasar
más ideas
3. Abre
1. La primera capa de solución
La cláusula limit n significa que los resultados de la consulta devuelven los primeros n datos
offset n significa omitir x declaraciones
limit y offset x cláusula significa que los resultados de la consulta omiten x datos, lee los primeros y datos
usando limit y offset , ordene en orden descendente y devuelva El segundo registro puede obtener el segundo valor más grande.
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
PD: preste atención a la robustez de sql, no olvide el juicio de valor nulo IFNULL
4. Extensión: N-ésimo salario más alto
Escriba una consulta SQL para informar el enésimo salario más alto en la tabla Empleado. Si no hay un enésimo salario más alto, la consulta debe informar nulo.
输入:
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
n = 2
输出:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
n = 2
输出:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| null |
+------------------------+
4.1 Descripción
La clasificación es un tema clásico en la base de datos, de hecho, se puede dividir en 3 escenarios según los detalles específicos de la clasificación:
Clasificación continua, como salario 3000, 2000, 2000, 1000, el resultado de la clasificación es 1-2-3-4, que refleja el mismo salario y diferentes nombres, la clasificación es similar al número
y el mismo salario y el mismo nombre pero la clasificación general no es continua, como la misma distribución salarial, los resultados de clasificación son 1-2-2-4
con el mismo salario y el mismo nombre y la clasificación total es continua, y el mismo resultado de clasificación salarial es 1-2 -2-3
Diferentes escenarios de aplicación pueden requerir diferentes resultados de clasificación, lo que también significa diferentes estrategias de consulta. El objetivo de esta pregunta es lograr el resultado N bajo el tercer método de clasificación, y es una clasificación global. No hay problema de agrupación, y en realidad es relativamente simple.
Vale la pena mencionar que existen funciones de ventana en bases de datos como Oracle, que pueden implementar fácilmente estos requisitos, y MySQL también introdujo funciones relacionadas hasta la versión 8.0. El último entorno OJ se actualizó a la versión 8.0 y las funciones de ventana se pueden usar directamente.
4.2 Ideas
El tipo de pregunta más simple es usar la función de ventana para jugar, por supuesto, si quieres desafiarte a ti mismo, puedes usar más soluciones para jugar.
4.3 Solución de la función de ventana
De hecho, hay funciones integradas relacionadas en mysql8.0, y se consideran varios problemas de clasificación:
- row_number(): Mismo salario pero diferentes nombres, equivalente al número de fila, por ejemplo, 3000, 2000, 2000, 1000 se clasifican como 1, 2, 3, 4
- rango (): el mismo salario y el mismo nombre, con un nivel de salto, por ejemplo, 3000, 2000, 2000, 1000 se clasifican como 1, 2, 2, 4
- dense_rank (): el mismo salario y el mismo nombre, sin saltos, como 1, 2, 2, 3 después de las clasificaciones 3000, 2000, 2000 y 1000
- ntile(): clasificación de cubetas, es decir, primero, la primera, la segunda y la tercera cubetas se dividen según el número de cubetas, y luego cada cubeta se clasifica desde 1, lo que no es muy común en la práctica.
Obviamente, este problema es usar la tercera función.
Además, estas tres funciones deben usarse junto con su pareja over() Hay dos parámetros comunes en over(), a saber
- dividir por, dividir por un campo
- order by, que es coherente con el orden normal por uso, también distingue entre ASC (predeterminado) y DESC, porque debe haber una base para la clasificación.
Nota: El siguiente código solo está disponible en mysql8.0 y superior, y la última DO ha sido apoyado.
SELECT
DISTINCT salary
FROM
(SELECT
salary, dense_rank() over(ORDER BY salary DESC) AS rnk
FROM
employee) tmp
WHERE rnk = N
Operación
¿Tienes una mejor solución al problema de la clasificación?