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

使用EXISTS的SQL查询未生效,如何获取每个客户的最后订单?

问题分析与解决方案

你的查询之所以返回所有行,是因为EXISTS子查询仅验证当前客户是否存在订单——只要该客户有至少一笔订单,分组后的子查询就会返回一行,导致EXISTS始终为真,无法过滤出最后一笔订单。

修正后的EXISTS写法

SELECT O1.custid, O1.orderid, O1.orderdate, O1.empid 
FROM Sales.Orders AS O1
WHERE EXISTS (
    SELECT 1
    FROM Sales.Orders AS O2
    WHERE O2.custid = O1.custid
    GROUP BY O2.custid
    HAVING MAX(O2.orderdate) = O1.orderdate
);

核心改动是在子查询中添加HAVING子句,将当前订单的orderdate与该客户的最大订单日期做对比,只有当两者相等时,EXISTS才会返回真,从而筛选出每个客户的最后一笔订单。

更简洁的窗口函数写法

如果你的数据库支持窗口函数(如SQL Server、MySQL 8+、PostgreSQL等),可以用以下方式实现,逻辑更清晰:

SELECT custid, orderid, orderdate, empid
FROM (
    SELECT 
        custid, orderid, orderdate, empid,
        -- 按客户分组,订单日期倒序编号,最后一笔订单编号为1
        ROW_NUMBER() OVER(PARTITION BY custid ORDER BY orderdate DESC) AS rn
    FROM Sales.Orders
) AS sub_query
WHERE rn = 1;

如果存在同一客户在同一天有多笔订单,且需要保留所有这些"最后日期"的订单,可以把ROW_NUMBER()替换为RANK(),这样同一天的订单会得到相同的编号,不会被过滤掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:52:05