查询以查找列的 nᵗʰ 最大值
Posted
技术标签:
【中文标题】查询以查找列的 nᵗʰ 最大值【英文标题】:Query to find nᵗʰ max value of a column 【发布时间】:2008-09-17 07:10:23 【问题描述】:我要查找2nd, 3rd, ... nth 列的最大值。
【问题讨论】:
什么数据库?我认为这个问题没有很好的“通用”解决方案。 我认为太笼统了:至少指定哪个 DBMS... 【参考方案1】:考虑下面的 Employee 表,其中有一列表示薪水。
+------+ |萨尔 | +------+ | 3500 | | 2500 | | 2500 | | 5500 | | 7500 | +------+以下查询将返回第 N 个最大值元素。
select SAL from EMPLOYEE E1 where
(N - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
例如。当需要第二个最大值时,
select SAL from EMPLOYEE E1 where
(2 - 1) = (select count(distinct(SAL))
from EMPLOYEE E2
where E2.SAL > E1.SAL )
+------+
|萨尔 |
+------+
| 5500 |
+------+
【讨论】:
一个适用于所有数据库的简单解决方案!好想! :) 很好的答案!我以前遇到过这个问题,并且对如何在不特定于供应商的情况下解决它感到困扰:) 一个可能的缺点是它为每一行执行子查询。 这太棒了!我将它与>=
运算符一起使用以获取最多第 N 个位置的所有行。我想为它添加一个排名,比如最大值为“1”,第二个最大值为“2”等。你知道如何去做吗?
@NurShomik 如果您需要一个通用的排名函数,请参阅:***.com/a/3333697/1385252
请解释一下。我无法理解比较是如何帮助我们的。【参考方案2】:
你没有指定哪个数据库,你可以在 mysql 上做
SELECT column FROM table ORDER BY column DESC LIMIT 7,10;
会跳过前 7 个,然后让你获得下一个最高的 10 个。
【讨论】:
如果你使用的是 mysql,这在 oracle(或者我相信的 mssql)中是行不通的【参考方案3】:您可以将列排序为降序格式,然后从第 n 行获取值。
编辑::
根据评论请求更新。 警告完全未经测试!
SELECT DOB FROM (SELECT DOB FROM USERS ORDER BY DOB DESC) WHERE ROWID = 6
上面的内容应该适用于 Oracle ...您可能必须首先获得正确的语法!
【讨论】:
你能提供一个代码sn-p吗?我尝试了您的建议,但无法从第 n 行获取值。 使用ROWID
既不安全也不实用。以sqlite 为例。 ROWID
可能会或可能不会连续生成。此外,ROWID
的顺序可能与请求列的顺序不匹配。
这会很慢,因为它需要先订购整个表格,然后再选择第 n 行。一些数据库现在提供此功能,例如,请参见下面 Pieter 和 Steven Dickinson 的回答。【参考方案4】:
同样,您可能需要修复您的数据库,但如果您希望数据集中可能存在重复值的前第二个值,您也需要进行分组:
SELECT column
FROM table
WHERE column IS NOT NULL
GROUP BY column
ORDER BY column DESC
LIMIT 5 OFFSET 2;
会跳过前两个,然后会让你获得下一个最高的五个。
【讨论】:
【参考方案5】:纯 SQL(注意:我建议使用特定于您的 DBMS 的 SQL 功能,因为它可能更有效)。这将为您提供第 n+1 个最大值(要获得最小值,请翻转
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 |
+------+
【讨论】:
【参考方案6】:(表名=学生,列名=标记)
select * from(select row_number() over (order by mark desc) as t,mark from student group by mark) as td where t=4
【讨论】:
MS SQL Server row_number【参考方案7】:您可以使用以下查询找到列的第 n 个最大值:
SELECT * FROM TableName a WHERE
n = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE a.ColumnName <=b.ColumnName);
【讨论】:
【参考方案8】:select column_name from table_name
order by column_name desc limit n-1,1;
其中 n = 1, 2, 3,....第 n 个最大值。
【讨论】:
【参考方案9】:这是 Oracle 的一种方法。此示例获得第 9 个最高值。只需将 9 替换为包含您要查找的位置的绑定变量。
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
如果您想要第 n 个唯一值,您可以在最里面的查询块上添加 DISTINCT。
【讨论】:
【参考方案10】:我自己在寻找答案时挖出了这个问题,这似乎适用于 SQL Server 2005(源自Blorgbeard's solution):
SELECT MIN(q.col1) FROM (
SELECT
DISTINCT TOP n col1
FROM myTable
ORDER BY col1 DESC
) q;
实际上,这是一个SELECT MIN(q.someCol) FROM someTable q
,表的前n个由SELECT DISTINCT...
查询检索。
【讨论】:
【参考方案11】:Select max(sal)
from table t1
where N (select max(sal)
from table t2
where t2.sal > t1.sal)
要找到第 N 个最大销售量。
【讨论】:
【参考方案12】:SELECT * FROM tablename
WHERE columnname<(select max(columnname) from tablename)
order by columnname desc limit 1
【讨论】:
【参考方案13】:这是从列中获取第 n 个最高值的查询,n=0 表示第二高,n=1 表示第三高,依此类推...
SELECT * FROM TableName
WHERE ColomnName<(select max(ColomnName) from TableName)-n order by ColomnName desc limit 1;
【讨论】:
【参考方案14】:简单的 SQL 查询来获取表 Employee
中具有 Nth MAX Salary
的员工详细信息。
sql> select * from Employee order by salary desc LIMIT 1 OFFSET <N - 1>;
考虑表结构为:
员工 ( id [int 主键 auto_increment], 名称 [varchar(30)], 工资 [int] );
示例:
如果你需要上表中的第三个MAX
工资,那么查询将是:
sql> select * from Employee order by salary desc LIMIT 1 OFFSET 2;
同样:
如果你需要上表中的第8个MAX
工资,那么查询将是:
sql> select * from Employee order by salary desc LIMIT 1 OFFSET 7;
注意: 当您必须获得 Nth
MAX
值时,您应该将OFFSET
作为 (N - 1)。
这样你可以在工资升序的情况下做同样的操作。
【讨论】:
【参考方案15】:mysql查询: 假设我想从员工表中找出第 n 个最高薪水
select salary
form employee
order by salary desc
limit n-1,1 ;
【讨论】:
【参考方案16】:在 SQL Server 中,只需执行以下操作:
select distinct top n+1 column from table order by column desc
然后丢弃第一个值,如果你不需要它。
【讨论】:
【参考方案17】:对于 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
【讨论】:
【参考方案18】:MySQL:
select distinct(salary) from employee order by salary desc limit (n-1), 1;
【讨论】:
【参考方案19】:回答: 上一秒:
select * from (select * from deletetable where rownum <=2 order by rownum desc) where rownum <=1
【讨论】:
当你不添加新东西时,请不要回答 4 岁的问题 :)【参考方案20】: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;
【讨论】:
【参考方案21】:我认为下面的查询将在 oracle sql 上完美运行...我自己测试过..
与此查询相关的信息:此查询使用名为 employee
和 department
的两个表,其中员工中的列名为:name
(员工姓名)、dept_id
(员工和部门通用)、@987654325 @
部门表中的列:dept_id
(员工表也常见),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
谢谢
【讨论】:
【参考方案22】:另一个使用分析函数的 Oracle:
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
【讨论】:
【参考方案23】:Select min(fee)
from fl_FLFee
where fee in (Select top 4 Fee from fl_FLFee order by 1 desc)
把第四个换成 N。
【讨论】:
【参考方案24】:你可以这样简化
SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT TOP 4 Sal FROM TableName ORDER BY Sal DESC)
如果 Sal 包含重复值,则使用此
SELECT MIN(Sal) FROM TableName
WHERE Sal IN
(SELECT distinct TOP 4 Sal FROM TableName ORDER BY Sal DESC)
4 将是第 n 个值,它可以是任何最高值,例如 5 或 6 等。
【讨论】:
【参考方案25】:(表名=学生,列名=马克):
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)
【讨论】:
【参考方案26】:在 PostgreSQL 中,从 Employee 表中找到第 N 个最大的薪水。
SELECT * FROM Employee WHERE salary in
(SELECT salary FROM Employee ORDER BY salary DESC LIMIT N)
ORDER BY salary ASC LIMIT 1;
【讨论】:
【参考方案27】:在 SQL Server 中查找特定列的第 N 个最大值的解决方案:
员工表:
销售表:
员工表数据:
==========
Id name
=========
6 ARSHAD M
7 Manu
8 Shaji
销售表数据:
=================
id emp_id amount
=================
1 6 500
2 7 100
3 8 100
4 6 150
5 7 130
6 7 130
7 7 330
查询以找出销售额最高的员工/N排名最高的销售人员
的详细信息select * from (select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name ) AS T1 WHERE(0)=( select COUNT(DISTINCT(total_amount)) from(select E.Id,E.name,SUM(S.amount) AS 'total_amount' from employee E INNER JOIN Sale S on E.Id=S.emp_id group by S.emp_id,E.Id,E.name )AS T2 WHERE(T1.total_amount<T2.total_amount) );
在 WHERE(0) 中将 0 替换为 n-1
结果:
========================
id name total_amount
========================
7 Manu 690
【讨论】:
【参考方案28】:表员工
salary
1256
1256
2563
8546
5645
您通过此查询找到第二个最大值
select salary
from employee
where salary=(select max(salary)
from employee
where salary <(select max(salary) from employee));
您通过此查询找到第三个最大值
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)));
【讨论】:
最外层的选择是无关的。停止在第一个 max(salary) 会起作用。 这个解决方案太疯狂了。以上是关于查询以查找列的 nᵗʰ 最大值的主要内容,如果未能解决你的问题,请参考以下文章