Получить самый последний результат к самой поздней дате с тремя столбцами, имеющими одинаковое значение в mysql - PullRequest
0 голосов
/ 04 марта 2020

Я новичок в sql и мне нужна ваша помощь. У меня есть данные результатов теста в базе данных, и я хочу получить последние результаты.

 ----------------------------------------------------------------------------------   
| ID | TestDate   | App | Service   | Environment | Critical | High | Medium | Low |
|----------------------------------------------------------------------------------|
| 1  | 2020-03-01 | app | service-a | sit         | 1        | 2    | 3      | 5   |
| 2  | 2020-03-02 | app | service-b | sit         | 0        | 3    | 2      | 1   |
| 3  | 2020-03-03 | app | service-a | sit         | 0        | 1    | 5      | 3   |

Я хочу получить только последний результат для service-a и затем результат для service-b. Я пытался

SELECT MAX(TestDate), App, Service, Environment, Critical, High, Medium, Low from table 
GROUP BY TestDate, App, Service, Environment, Critical, High, Medium, Low;

, но он по-прежнему возвращает оба значения service-a. Удаление некоторых столбцов в GROUP BY приведет к ошибке неагрегированного столбца.

Вот некоторые примеры данных, с которыми вы можете проверить.

CREATE TABLE IF NOT EXISTS `test_results` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `app` VARCHAR(10) NULL,
  `environment` VARCHAR(45) NULL,
  `service` VARCHAR(256) NULL,
  `service_version` VARCHAR(20) NULL,
  `test_date` DATETIME NOT NULL,
  `critical` VARCHAR(256) NULL,
  `high` VARCHAR(256) NULL,
  `medium` VARCHAR(256) NULL,
  `low` VARCHAR(256) NULL,
  PRIMARY KEY (`id`));
INSERT INTO `test_results` (`app`, `environment`, `service`, `service_version`, `test_date`, `critical`, `high`, `medium`, `low`)
VALUES ("app1", "sit", "service-a", "1.0.0", "2020-03-01 01:03:08", 1, 2, 3, 4),
 ("app1", "sit", "service-a", "1.0.1", "2020-03-03 01:03:08", 5, 7, 3, 1),
 ("app1", "sit", "service-b", "1.1.2", "2020-03-02 01:03:08", 5, 9, 6, 4),
 ("app1", "sit", "service-c", "1.0.5", "2020-03-02 01:03:08", 3, 1, 9, 4);

И скрипка того же

РЕДАКТИРОВАТЬ: Добавлена ​​скрипка

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Потенциально более эффективное решение, чем подзапрос с max(), заключается в следующем:

SELECT t.*
FROM `table` t
   LEFT JOIN `table` t1 ON t1.service = t.service AND t1.testdate > t.testdate
WHERE t1.id IS NULL;

Только те строки, которые не успешно объединяются в LEFT JOIN, гарантируют, что мы видеть только результаты, где testdate является наибольшим значением для этого service.

1 голос
/ 04 марта 2020

Вы можете фильтровать вместо агрегирования;

select t.*
from mytable
where t.testdate = (
    select max(t1.testdate) from mytable t1 where t1.service = t.service
)
0 голосов
/ 04 марта 2020

Это решение позволит вам иметь несколько результатов тестов в одну и ту же дату и время и при этом принимать самые последние - при условии, что ваш идентификатор увеличивается на каждую новую запись.

SELECT
  results.*
FROM `test_results` AS results
JOIN `test_results` AS latest_results
  ON latest_results.id = (
    SELECT id FROM `test_results` 
    WHERE service = results.service
    ORDER BY test_date DESC, id DESC LIMIT 1)
WHERE
  latest_results.id = results.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...