Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中查找每个“key”列的日期都是第二大的记录?_Mysql_Sql_Date - Fatal编程技术网

在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感谢你的提醒,我没有意识到这一点。