Mysql 从表中获取第二高的值
我有一张这样的桌子:Mysql 从表中获取第二高的值,mysql,sql,Mysql,Sql,我有一张这样的桌子: +----+---------+------------+ | id | conn_id | read_date | +----+---------+------------+ | 1 | 1 | 2010-02-21 | | 2 | 1 | 2011-02-21 | | 3 | 2 | 2011-02-21 | | 4 | 2 | 2013-02-21 | | 5 | 2 | 2014-02-21 |
+----+---------+------------+
| id | conn_id | read_date |
+----+---------+------------+
| 1 | 1 | 2010-02-21 |
| 2 | 1 | 2011-02-21 |
| 3 | 2 | 2011-02-21 |
| 4 | 2 | 2013-02-21 |
| 5 | 2 | 2014-02-21 |
+----+---------+------------+
我需要特定“连接id”的第二高读取日期,即我需要一个连接id上的分组。请帮助我解决此问题。以下是特定连接id的解决方案:
以下答案应适用于MSSQL:
select id,conn_id,read_date from (
select *,ROW_NUMBER() over(Partition by conn_id order by read_date desc) as RN
from my_table
)
where RN =2
这里有一篇关于MySQL中rank函数使用的有趣文章:如果您的表设计为ID-日期匹配,即大ID总是大日期,您可以按ID分组,否则请执行以下操作:
$sql_max = '(select conn_id, max(read_date) max_date from tab group by 1) as tab_max';
$sql_max2 = "(select tab.conn_id,max(tab.read_date) max_date2 from tab, $sql_max
where tab.conn_id = tab_max.conn_id and tab.read_date < tab_max.max_date
group by 1) as tab_max2";
$sql = "select tab.* from tab, $sql_max2
where tab.conn_id = tab_max2.conn_id and tab.read_date = tab_max2.max_date2";
谢谢您的回答,但是您不能针对一般情况修改它吗?它应该为所有唯一的“连接id”打印第二高的“读取日期”。但是您能告诉我为什么这个查询是从my_表中选择*,maxread_date为prev,其中读取日期有两个相同的最大值时,您想做什么?
select id,conn_id,read_date from (
select *,ROW_NUMBER() over(Partition by conn_id order by read_date desc) as RN
from my_table
)
where RN =2
$sql_max = '(select conn_id, max(read_date) max_date from tab group by 1) as tab_max';
$sql_max2 = "(select tab.conn_id,max(tab.read_date) max_date2 from tab, $sql_max
where tab.conn_id = tab_max.conn_id and tab.read_date < tab_max.max_date
group by 1) as tab_max2";
$sql = "select tab.* from tab, $sql_max2
where tab.conn_id = tab_max2.conn_id and tab.read_date = tab_max2.max_date2";