使用以下代码,我可以获取具有最大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
答案 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;