在mysql中,通过三列具有相同值的最新日期获取最新结果

在mysql中,通过三列具有相同值的最新日期获取最新结果,mysql,sql,database,greatest-n-per-group,Mysql,Sql,Database,Greatest N Per Group,我是sql新手,需要您的帮助。我有一个数据库中的测试结果数据,我想得到最新的结果 ---------------------------------------------------------------------------------- | ID | TestDate | App | Service | Environment | Critical | High | Medium | Low | |------------------------------------

我是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   |
我只想得到服务a的最新结果,然后是服务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);
同样的


编辑:添加fiddle

您可以过滤而不是聚合

select t.*
from mytable
where t.testdate = (
    select max(t1.testdate) from mytable t1 where t1.service = t.service
)

你可以过滤而不是聚合

select t.*
from mytable
where t.testdate = (
    select max(t1.testdate) from mytable t1 where t1.service = t.service
)

一个可能比使用
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;

只有返回未成功加入
左连接的行
才能确保我们只看到
testdate
是该
服务的最高值的结果

一个可能比使用
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;

只有返回未成功加入
左连接的行
才能确保我们只看到
testdate
是该
服务的最高值的结果

此解决方案将允许您在同一日期和时间获得多个测试结果,如果你的id在每一条新记录上都在增加,那么仍然使用最新的一条

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

此解决方案将允许您在同一日期和时间获得多个测试结果,并且仍然获取最新的测试结果—前提是您的id在每个新记录上都会增加

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

@草莓加提琴。“谢谢你。”草莓加了一把小提琴。谢谢。嗨,这对我来说也很有效,不过我更喜欢GMB的答案,因为我已经有了一个加入,为了得到那个表,我不想再添加一个。非常感谢。您好,这对我来说也很有效,但是我更喜欢GMB的答案,因为我已经有了一个加入,以便得出该表,我不想再添加一个。非常感谢。欢迎@kariasboolk。如果我的答案正确回答了你的问题,请点击复选标记。。。谢谢。欢迎@kariasbook。如果我的答案正确回答了你的问题,请点击复选标记。。。谢谢