create - sql database azure
Consulta para encontrar el n-ésimo valor máximo de una columna (25)
Quiero encontrar el segundo, tercer ... último valor máximo de una columna
(Nombre de la tabla = Estudiante, Nombre de la columna = marca)
select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
(TableName = Student, ColumnName = Mark):
select *
from student
where mark=(select mark
from(select row_number() over (order by mark desc) as t,
mark
from student group by mark) as td
where t=2)
Aquí hay un método para Oracle. Este ejemplo obtiene el noveno valor más alto. Simplemente reemplace el 9 con una variable de enlace que contenga la posición que está buscando.
select created from (
select created from (
select created from user_objects
order by created desc
)
where rownum <= 9
order by created asc
)
where rownum = 1
Si quisiera el enésimo valor único, agregaría DISTINCT en el bloque de consulta más interno.
Considere la siguiente tabla de Empleados con una sola columna para el salario.
+------+ | Sal | +------+ | 3500 | | 2500 | | 2500 | | 5500 | | 7500 | +------+
La siguiente consulta devolverá el N-ésimo elemento Máximo.
select SAL from EMPLOYEE E1 where
(N - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
Por ej. cuando se requiere el segundo valor máximo,
select SAL from EMPLOYEE E1 where
(2 - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
+------+ | Sal | +------+ | 5500 | +------+
Creo que la consulta a continuación funcionará perfectamente en Oracle sql ... Lo he probado yo mismo ...
Información relacionada con esta consulta: esta consulta utiliza dos tablas llamadas employee
y department
con columnas en employee named: name
(nombre del empleado), dept_id
(común al empleado y departamento), salary
Y columnas en la tabla de departamento: dept_id
(común para la tabla de empleados también), dept_name
SELECT
tab.dept_name,MIN(tab.salary) AS Second_Max_Sal FROM (
SELECT e.name, e.salary, d.dept_name, dense_rank() over (partition BY d.dept_name ORDER BY e.salary) AS rank FROM department d JOIN employee e USING (dept_id) ) tab
WHERE
rank BETWEEN 1 AND 2
GROUP BY
tab.dept_name
Gracias
De nuevo, es posible que necesite corregir su base de datos, pero si desea el segundo valor superior en un conjunto de datos que potencialmente tiene el valor duplicado, también querrá hacer un grupo:
SELECT column
FROM table
WHERE column IS NOT NULL
GROUP BY column
ORDER BY column DESC
LIMIT 5 OFFSET 2;
Saltaría los primeros dos, y luego te conseguirá los próximos cinco más altos.
Empleado de mesa
salary
1256
1256
2563
8546
5645
Encuentra el segundo valor máximo por esta consulta
select salary
from employee
where salary=(select max(salary)
from employee
where salary <(select max(salary) from employee));
Encuentra el tercer valor máximo por esta consulta
select salary
from employee
where salary=(select max(salary)
from employee
where salary <(select max(salary)
from employee
where salary <(select max(salary)from employee)));
En SQL Server, simplemente hazlo:
select distinct top n+1 column from table order by column desc
Y luego tira el primer valor, si no lo necesitas.
Esta es una consulta para obtener el n-más alto de colomn puesto n = 0 para el segundo más alto y n = 1 para el tercero más alto y así sucesivamente ...
SELECT * FROM TableName
WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;
MySQL:
select distinct(salary) from employee order by salary desc limit (n-1), 1;
No especificó qué base de datos, en MySQL puede hacer
SELECT column FROM table ORDER BY column DESC LIMIT 7,10;
Omitiría los primeros 7 y luego obtendría los siguientes diez más altos.
Otro para Oracle usando funciones analíticas:
select distinct col1 --distinct is required to remove matching value of column
from
( select col1, dense_rank() over (order by col1 desc) rnk
from tbl
)
where rnk = :b1
Puede encontrar el enésimo valor más grande de la columna usando la siguiente consulta:
SELECT * FROM TableName a WHERE
n = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE a.ColumnName <=b.ColumnName);
Puede ordenar la columna en formato descendente y luego simplemente obtener el valor de la enésima fila.
EDITAR::
Actualizado según la solicitud de comentarios. ¡ADVERTENCIA completamente no probada!
SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6
Algo como lo anterior debería funcionar para Oracle ... ¡es posible que primero tenga que obtener la sintaxis!
Puedes simplificar así
SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)
Si el Sal contiene valores duplicados, utiliza esto
SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)
el 4 será enésimo valor, puede ser cualquier valor más alto, como 5 o 6, etc.
Puro SQL (nota: recomendaría el uso de características SQL específicas para su DBMS, ya que es probable que sea más eficiente). Esto te dará el n + 1º valor más grande (para obtener el más pequeño, voltea el <). Si tiene duplicados, hágala COUNT (VALOR DISTINTO) ..
select id from table order by id desc limit 4 ;
+------+
| id |
+------+
| 2211 |
| 2210 |
| 2209 |
| 2208 |
+------+
SELECT yourvalue
FROM yourtable t1
WHERE EXISTS( SELECT COUNT(*)
FROM yourtable t2
WHERE t1.id <> t2.id
AND t1.yourvalue < t2.yourvalue
HAVING COUNT(*) = 3 )
+------+
| id |
+------+
| 2208 |
+------+
Respuesta: segundo lugar:
select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1
Simplemente busqué esta pregunta cuando busqué la respuesta yo mismo, y parece que esto funciona para SQL Server 2005 (derivado de la solución de Blorgbeard ):
SELECT MIN(q.col1) FROM (
SELECT
DISTINCT TOP n col1
FROM myTable
ORDER BY col1 DESC
) q;
Efectivamente, ese es un SELECT MIN(q.someCol) FROM someTable q
, con la n superior de la tabla recuperada por la consulta SELECT DISTINCT...
para SQL 2005:
SELECT col1 from
(select col1, dense_rank(col1) over (order by col1 desc) ranking
from t1) subq where ranking between 2 and @n
Simple SQL Query para obtener el detalle del empleado que tiene Nth MAX Salary
en la tabla Employee
.
sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;
Considere la estructura de la tabla como:
Empleado (id [int clave primaria auto_increment], nombre [varchar (30)], salario [int]);
Ejemplo:
Si necesita el 3er salario MAX
en la tabla anterior, la consulta será:
sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;
Similar:
Si necesita el 8º salario MAX
en la tabla anterior, la consulta será:
sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;
NOTA: Cuando debe obtener el valor Nth
MAX
, debeOFFSET
elOFFSET
como (N - 1) .
De esta manera puede hacer el mismo tipo de operación en caso de salario en orden ascendente.
SELECT * FROM tablename
WHERE columnname<(select max(columnname) from tablename)
order by columnname desc limit 1
Select max(sal)
from table t1
where N (select max(sal)
from table t2
where t2.sal > t1.sal)
Para encontrar la Nth max sal.
Select min(fee)
from fl_FLFee
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)
Cambiar el número cuatro con N.
select sal,ename from emp e where
2=(select count(distinct sal) from emp where e.sal<=emp.sal) or
3=(select count(distinct sal) from emp where e.sal<=emp.sal) or
4=(select count(distinct sal) from emp where e.sal<=emp.sal) order by sal desc;
select column_name from table_name
ordered by column_name desc limit n-1,1;
donde n = 1, 2, 3, .... nth valor máximo.