当日期匹配时,如何在 MySQL 中每组获得 1 条记录?

How do you get 1 record per group in MySQL when dates match?

据我所知,这不是重复的,因为其他人都有不同的日期。例如,我有以下 table 公司、仪表和最后服务日期:

Company    MeterCode  Name  LastDate
A          1          MeA   1/1/20
A          2          MeB   1/1/20
A          3          MeC   1/2/20
A          4          MeD   1/2/20

B          1          MeE   2/1/20
B          2          MeF   2/1/20
B          3          MeG   2/2/20
B          4          MeH   2/2/20

如何查询此 table 以获得每个公司 1 行返回所有列但具有最新日期?多个仪表可以具有与您看到的相同的最后维修日期,但我不在乎最终使用哪个仪表,只要它是最近的日期即可。在上面的示例中,我想以这样的方式结束:

Company    MeterCode  Name  LastDate
A          4          MeD   1/2/20
B          4          MeH   2/2/20

这是 Stack Overflow 上经常询问的 查询的变体。

这是一个适用于 MySQL 8.0 的解决方案,它支持 window functions:

SELECT t.Company, t.MeterCode, t.Name, t.LastDate
FROM (
    SELECT Company, MeterCode, Name, LastDate,
      ROW_NUMBER() OVER (PARTITION BY Company ORDER BY LastDate DESC) AS rownum
    FROM WhateverYourTableNameIs
) AS t
WHERE t.rownum = 1

你可能会问,"what if I'm not using MySQL 8.0?"

MySQL 8.0 正式发布已经两年了。我认为是时候开始告诉人们,如果他们想要它支持的功能,就应该升级。

对于 8.0+ 之前的 MySql 版本,您可以在 WHERE 子句中使用相关子查询:

select t.* from tablename t
where t.metercode = (
  select metercode from tablename
  where company = t.company
  order by lastdate desc, metercode desc limit 1
) 

参见demo
结果:

| Company | MeterCode | Name | LastDate  |
| ------- | --------- | ---- | ----------|
| A       | 4         | MeD  | 01/02/20  |
| B       | 4         | MeH  | 02/02/20  |