You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从每个分组获取Top1记录 SQL按公司分组取最新单条发票数据

完全可以结合最大id实现需求,由于id是accountinginvoice表的唯一主键,同公司同开票日期下id值更大的记录对应更新的发票数据,只需调整关联逻辑即可。

方法1:通用兼容写法(适配所有SQL数据库,无需窗口函数支持)

在原有子查询的基础上新增一层最大id过滤逻辑,修改后SQL如下:

SELECT accountinginvoice.id, accountinginvoice.CompanyId, accountinginvoice.invoicedate
FROM accountinginvoice
INNER JOIN (
    -- 取每个公司对应最大开票日期下的最大id
    SELECT MAX(a.id) as max_id, a.companyid, a.invoicedate
    FROM accountinginvoice a
    INNER JOIN (
        -- 先取每个公司的最大开票日期
        SELECT MAX(invoicedate) as invoicedate, companyid 
        FROM accountinginvoice
        GROUP BY companyid
    ) AS max_date ON a.invoicedate = max_date.invoicedate AND a.companyid = max_date.companyid
    GROUP BY a.companyid, a.invoicedate
) AS max_id_record ON accountinginvoice.id = max_id_record.max_id
ORDER BY accountinginvoice.invoicedate

该写法逻辑和你原有SQL兼容性一致,最终只会返回每个公司最新开票日期下id最大的1条记录,你的示例中最终只会返回id=1045的对应记录。

方法2:窗口函数写法(适配MySQL8.0+、PostgreSQL、SQL Server等新版本数据库)

用ROW_NUMBER()窗口函数实现逻辑更简洁:

SELECT id, CompanyId, invoicedate
FROM (
    SELECT 
        *,
        -- 按公司分区,先按开票日期倒序,同日期按id倒序排列
        ROW_NUMBER() OVER (PARTITION BY companyid ORDER BY invoicedate DESC, id DESC) AS rn
    FROM accountinginvoice
) t
WHERE rn = 1
ORDER BY invoicedate

该写法执行效率更高,代码可读性更好。


内容的提问来源于stack exchange,提问作者geoff swartz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:06:02