Нахождение каждой записи, имеющей вторую по величине дату для каждого ключевого столбца в mysql? - PullRequest
0 голосов
/ 06 сентября 2018

С кодом ниже, я могу получить каждый ключ с максимальным значением 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 голосов
/ 06 сентября 2018

Это будет работать для любой версии MySQL. Более поздние версии будут поддерживать оконные функции.

Отредактировано для ввода Раймонда, но для версий> = 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;
0 голосов
/ 06 сентября 2018

Вы можете использовать коррелированный подзапрос:

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
                 );
0 голосов
/ 06 сентября 2018

Это должно работать, если вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...