如何查询InvoiceLog表中指定发票的最新日期行数据?
解决获取指定发票最新日期行数据的问题
表结构及数据
| Invoice | Status | Date | Explanation |
|---|---|---|---|
| 44587 | 1 | 02.03.2022 | Awaiting update |
| 44587 | 2 | 07.03.2022 | Processed |
问题原因
你当前的SQL语句返回两条结果,是因为GROUP BY子句包含了Status和Explanation——这两个字段在两行数据中取值不同,导致分组后生成两个独立组,最终输出两条记录。
可行解决方案
方法1:窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()按发票分组,日期倒序排序,取排序为1的行(即最新日期行):
SELECT Invoice, Status, Date, Explanation FROM ( SELECT Invoice, Status, Date, Explanation, ROW_NUMBER() OVER (PARTITION BY Invoice ORDER BY Date DESC) AS rn FROM InvoiceLog WHERE Invoice = 44587 ) t WHERE rn = 1;
方法2:子查询关联
先获取目标发票的最大日期,再关联原表匹配对应行:
SELECT d.Invoice, d.Status, d.Date, d.Explanation FROM InvoiceLog d JOIN ( SELECT Invoice, MAX(Date) AS MaxDate FROM InvoiceLog WHERE Invoice = 44587 GROUP BY Invoice ) t ON d.Invoice = t.Invoice AND d.Date = t.MaxDate WHERE d.Invoice = 44587;
方法3:TOP 1筛选(适用于SQL Server、Access等)
直接按日期倒序排序后取第一行:
SELECT TOP 1 Invoice, Status, Date, Explanation FROM InvoiceLog WHERE Invoice = 44587 ORDER BY Date DESC;
内容的提问来源于stack exchange,提问作者MegaOctane
相关产品推荐
相关产品推荐

