当日期匹配时,如何在 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 上经常询问的 greatest-n-per-group 查询的变体。
这是一个适用于 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 |
据我所知,这不是重复的,因为其他人都有不同的日期。例如,我有以下 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 上经常询问的 greatest-n-per-group 查询的变体。
这是一个适用于 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 |