是否在mysql中为每个“键”列找到具有第二大日期的每个记录?

时间:2018-09-06 17:04:01

标签: mysql sql date

使用以下代码,我可以获取具有最大key_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/10/2008

我需要匹配记录2(在key1中第二大)和3(在key2中第二大)

2   Key1  10/10/2009
3   Key2  10/10/2011

3 个答案:

答案 0 :(得分:1)

如果您使用的是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

答案 1 :(得分: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
                 );

答案 2 :(得分:0)

这将适用于任何MySQL版本。更高版本将支持窗口功能。

针对Raymond的输入进行了编辑,但对于版本== 8或更高版本,反正可能仅使用窗口函数。

http://sqlfiddle.com/#!9/fe157c/9

CREATE TABLE TEST_DATA (
    ID_Field VARCHAR(100),
    Test_Integer INTEGER
  );

INSERT INTO TEST_DATA VALUES ('1',1);
INSERT INTO TEST_DATA VALUES ('1',2);
INSERT INTO TEST_DATA VALUES ('1',3);
INSERT INTO TEST_DATA VALUES ('2',5);
INSERT INTO TEST_DATA VALUES ('2',6);
INSERT INTO TEST_DATA VALUES ('2',-1);
INSERT INTO TEST_DATA VALUES ('2',4);
INSERT INTO TEST_DATA VALUES ('3',1);
INSERT INTO TEST_DATA VALUES ('3',2);

SELECT ID_Field,
       Test_Integer
  FROM (SELECT TD1.ID_field,
               TD1.Test_Integer,
               COUNT(TD2.ID_Field) + 1 rn
          FROM TEST_DATA TD1
          LEFT
          JOIN TEST_DATA TD2
            ON TD1.ID_Field = TD2.ID_Field
           AND TD1.Test_Integer < TD2.Test_Integer
         GROUP
            BY TD1.ID_Field,
               TD1.Test_Integer
         ORDER
            BY TD1.ID_Field,
               TD1.Test_Integer
       ) TMP
 WHERE TMP.rn = 2;