Ejercicios SQL (2)

Tabla de contenido

1. Enésimo salario más alto (177)

2. Ranking de puntuación (178)


1. Enésimo salario más alto (177)

superficie: Employee

+-------------+------+ 
| Nombre de columna | Tipo | 
+-------------+------+ 
| id | int | 
| salario | int | 
+-------------+------+ 
Id es la columna de clave principal de la tabla. 
Cada fila de la tabla contiene información sobre el salario de un empleado.

Escriba una consulta SQL para informar  el  salario más alto Employee en la tabla  . nSi no hay el  n salario más alto, la consulta debe reportarse como  null .

Ejemplo 1:

Entrada:  
Tabla de empleados: 
+----+--------+ 
| id | salario | 
+----+-------+ 
| 1 | 100 | 
| 2 | 200 | 
| 3 | 300 | 
+----+--------+ 
n = 2 salida: 
+---------------------- + 
| getNthHighestSalary( 2) | 
+------------------------+ 
| 200 | 
+--------------------------- ---- -------+
 

Ejemplo 2:

Entrada:  
Tabla de empleados: 
+----+--------+ 
| id | salario | 
+----+-------+ 
| 1 | 100 | 
+---- + --------+ 
n = 2 salida: 
+---------------------+ 
| obtenerNthHighestSalary(2) | 
+-- ---- ------------------+ 
| nulo | 
+----------------------- -+
 

Dos soluciones: pienso en la paginación más simple, y podemos devolver los datos que queremos directamente con el límite existente.

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare m INT;
SET m = N-1;
  RETURN (
      # Write your MySQL query statement below.
      select ifnull
      (
          (
              select distinct salary
              from employee
              order by salary desc
              limit 1 offset m
          ), null
      )
  );
END

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare m INT;
SET m = N-1;
  RETURN (
      # Write your MySQL query statement below.
      select ifnull
      (
          (
              select distinct salary
              from employee
              order by salary desc
              limit m,1
          ), null
      )
  );
END

2. Ranking de puntuación (178)

superficie: Scores

+-------------+---------+ 
| Nombre de columna | Tipo | 
+-------------+---- -----+ 
| id | int | 
| puntuación | decimal | 
+-------------+---------+ 
Id es la clave principal de la tabla. 
Cada fila de esta tabla contiene la puntuación de un juego. La puntuación es un valor de coma flotante con dos decimales.

Escriba una consulta SQL para ordenar las puntuaciones. La clasificación se calcula de acuerdo con las siguientes reglas:

  • Las puntuaciones deben clasificarse de mayor a menor.
  • Si los dos puntajes son iguales, entonces los rangos de los dos puntajes deben ser los mismos.
  • Después de clasificar la misma puntuación, el número de clasificación debe ser el siguiente número entero consecutivo. En otras palabras, no debe haber brechas en los números entre los rangos.

Devuelve la tabla de resultados en  score orden descendente.

Ejemplo 1:

Entrada:  
tabla de puntuaciones: 
+----+-------+ 
| id | puntuación | 
+----+-------+ 
| 1 | 3,50 | 
| 2 | 3,65 | 
| 3 | 4.00 | 
| 4 | 3.85 | 
| 5 | 4.00 | 
| 6 | 3.65 | 
+----+-------+ Salida: 
+-------+------+ 
| puntaje | rango | 
+-------+------+ 
| 4.00 | 1 | | 
4.00 | 1 | 
| 3.85 | 2 | 
| 3.65 | 3 | 
| 3.65 | 3 | 
| 3.50 | 4 | 
+-------+------+
 

Respuesta:

Método 1 ( Lituo )

dense_rank() sobre
la función: después de que se descubran las condiciones especificadas, se realizará la clasificación. Si las condiciones son las mismas, las clasificaciones serán las mismas y las clasificaciones serán discontinuas. Explicación: Tiene la misma función que rank() over, la diferencia es que dense_rank() over ranking es denso y continuo. Por ejemplo, la clasificación de los estudiantes, utilizando esta función, dos estudiantes con las mismas calificaciones están empatados, y el siguiente estudiante se clasificará a continuación. Es decir: 1 1 2 3 4 5 5 6

# Write your MySQL query statement below
SELECT 
    score,tmp.rank
FROM 
    (SELECT 
        score, dense_rank() over (ORDER BY score DESC) AS 'rank'
      FROM 
        scores) tmp
ORDER BY score DESC

Método 2 ( Lickout )

Paso 1: ordenar las puntuaciones después de la deduplicación y agregar una columna de incremento automático para obtener la clasificación de la deduplicación

@rank_no:=0, establezca el valor inicial de la variable @rank_no en 0.

@rank_no:=@rank_no+1, acumula el valor de @rank_no.

select score,(@rank_no := @rank_no + 1) as 'rank'
from 
    (select distinct score from scores) s,
    (select @rank_no := 0) t
order by score desc

Paso 2: asocie los resultados anteriores con nuestra tabla de puntuaciones y, finalmente, obtenga una ordenación sin deduplicación.

select
    a.score,
    b.rank
from 
    Scores a
    inner join
    (第一步的数据) b
    on a.score = b.score
order by a.score desc;
select
    a.score,
    b.rank
from 
    Scores a
    inner join
    (select score,(@rank_no := @rank_no + 1) as 'rank'
    from (select distinct score from scores) s,(select @rank_no := 0) t
    order by score desc) b
    on a.score = b.score
order by a.score desc;

Supongo que te gusta

Origin blog.csdn.net/weixin_53011574/article/details/131347507
Recomendado
Clasificación