[SQL Butcher Series] leetcode-176. El segundo salario más alto

inserte la descripción de la imagen aquí

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?


inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_31557939/article/details/126697436
Recomendado
Clasificación