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

Posted

技术标签:

【中文标题】获取最新日期的最新结果,其中三列在mysql中具有相同的值【英文标题】:Get latest result by latest date with three columns having the same value in mysql 【发布时间】:2020-06-16 22:22:06 【问题描述】:

我是 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);

和fiddle 一样

编辑:添加小提琴

【问题讨论】:

@Strawberry 添加了小提琴。谢谢。 【参考方案1】:

您可以过滤而不是聚合;

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

【讨论】:

欢迎@KariasBolster。如果我的回答正确回答了您的问题,十个accept it 点击复选符号...谢谢。【参考方案2】:

一个可能比带有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 的行确保我们只看到testdateservice 的最大值的结果。

【讨论】:

您好,这也适用于我,但我更喜欢 GMB 的回答,因为我已经加入了该表格,并且我不想添加另一个表格。非常感谢。【参考方案3】:

此解决方案将允许您在同一日期和时间获得多个测试结果,并且仍然获取最新的结果 - 前提是您的 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

【讨论】:

以上是关于获取最新日期的最新结果,其中三列在mysql中具有相同的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中获取具有最新 lastModified 日期的文件? [复制]

通过 id mysql 查找具有最新日期的行

SQL+获取具有最新日期的行+row_number()+重复时的情况

在 SQL 中获取具有唯一目的地的最新数据

我只想查看具有最新报告日期的行

从分组的 MySQL 数据中获取最新日期