在mysql中查找每个“key”列的日期都是第二大的记录?
有了下面的代码,我可以得到每一个密钥的最大密钥\日期值在mysql中查找每个“key”列的日期都是第二大的记录?,mysql,sql,date,Mysql,Sql,Date,有了下面的代码,我可以得到每一个密钥的最大密钥\日期值 SELECT * FROM `log` GROUP BY `key` ORDER BY `key_date` DESC 但我怎样才能得到所有与第二大日期匹配的记录呢 id Key key_date -------------------- 1 Key1 10/10/2010 2 Key1 10/10/2009 3 Key2 10/10/2011 4 Key2 10/10/2012 5 Key1 10/1
SELECT *
FROM `log`
GROUP BY `key`
ORDER BY `key_date` DESC
但我怎样才能得到所有与第二大日期匹配的记录呢
id Key key_date
--------------------
1 Key1 10/10/2010
2 Key1 10/10/2009
3 Key2 10/10/2011
4 Key2 10/10/2012
5 Key1 10/10/2008
我需要匹配key1中第二大的记录2和key2中第二大的记录3
2 Key1 10/10/2009
3 Key2 10/10/2011
如果您使用的是MySQL 8.0或更高版本,这应该可以实现——我认为一个窗口功能将是一个很好的方法
SELECT id, Key, Key_date
FROM
(
SELECT id, KEY, key_date,
ROW_NUMBER() OVER(PARTITION BY Key ORDER BY key_date DESC) AS row_n
FROM log
) a1
WHERE row_n = 2
如果您使用的是MySQL 8.0或更高版本,这应该可以实现——我认为一个窗口功能将是一个很好的方法
SELECT id, Key, Key_date
FROM
(
SELECT id, KEY, key_date,
ROW_NUMBER() OVER(PARTITION BY Key ORDER BY key_date DESC) AS row_n
FROM log
) a1
WHERE row_n = 2
这适用于任何MySQL版本。更高版本将支持窗口功能 为Raymond的输入编辑,但版本>=8。。。可能只是使用窗口函数
这适用于任何MySQL版本。更高版本将支持窗口功能 为Raymond的输入编辑,但版本>=8。。。可能只是使用窗口函数
您可以使用相关子查询:
SELECT l.*
FROM `log` l
WHERE key_date = (SELECT l1.`key_date`
FROM `log` l1
WHERE l1.`key` = l.`key`
ORDER BY l1.`key_date` DESC
LIMIT 1 OFFSET 1
);
您可以使用相关子查询:
SELECT l.*
FROM `log` l
WHERE key_date = (SELECT l1.`key_date`
FROM `log` l1
WHERE l1.`key` = l.`key`
ORDER BY l1.`key_date` DESC
LIMIT 1 OFFSET 1
);
什么版本的MySQL?我需要它在5.7.21和5.6.40My版本上都能工作。什么版本的MySQL?我需要它在5.7.21和5.6.40My版本上都能工作。旁注:这将适用于任何MySQL版本。MySQL 8.0不会自动按annymore排序组。相信GROUP BY是正确的排序信任一个不推荐使用的功能,该功能自MySQL 5.7以来就已不推荐使用。。请参阅演示MySQL 5.7与MySQL 8.0。更高版本将支持窗口函数。在MySQL 8.0中为True,您应该使用窗口功能。@RaymondNijland感谢您的提醒,但他没有意识到这一点。旁注:这适用于任何MySQL版本。MySQL 8.0不会自动按annymore对组进行排序。相信GROUP BY排序就是相信自MySQL 5.7以来已弃用的功能。。请参阅演示MySQL 5.7与MySQL 8.0。更高版本将支持窗口函数。在MySQL 8.0中是这样的,你应该使用一个窗口函数。@RaymondNijland感谢你的提醒,我没有意识到这一点。