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

基于SQL Server的Northwind数据库查询员工每月最后下单日及当日订单

解决方案

你可以通过以下几种方式,基于你已有的查询逻辑关联原订单表,或者直接用窗口函数筛选目标订单:

方法1:CTE+关联查询

先计算每个员工每月的最后下单日期,再关联原订单表获取当日所有订单:

WITH EmployeeMonthlyLastOrder AS (
    SELECT 
        EmployeeID,
        YEAR(OrderDate) AS OrderYear,
        MONTH(OrderDate) AS OrderMonth,
        MAX(CONVERT(date, OrderDate)) AS LastOrderDay
    FROM northwind.dbo.Orders
    GROUP BY EmployeeID, YEAR(OrderDate), MONTH(OrderDate)
)
SELECT o.*
FROM northwind.dbo.Orders o
JOIN EmployeeMonthlyLastOrder emlo 
    ON o.EmployeeID = emlo.EmployeeID
    AND YEAR(o.OrderDate) = emlo.OrderYear
    AND MONTH(o.OrderDate) = emlo.OrderMonth
    AND CONVERT(date, o.OrderDate) = emlo.LastOrderDay
ORDER BY o.EmployeeID, o.OrderDate;

方法2:窗口函数直接筛选

用窗口函数给每条订单标记出所属员工当月的最后下单日,再筛选匹配的记录:

SELECT *
FROM (
    SELECT 
        *,
        MAX(CONVERT(date, OrderDate)) OVER (PARTITION BY EmployeeID, YEAR(OrderDate), MONTH(OrderDate)) AS LastOrderDay
    FROM northwind.dbo.Orders
) AS OrderWithLastDay
WHERE CONVERT(date, OrderDate) = LastOrderDay
ORDER BY EmployeeID, OrderDate;

方法3:子查询关联

对每条订单,通过子查询找到同员工同月份的最后下单日,再筛选匹配的订单:

SELECT o.*
FROM northwind.dbo.Orders o
WHERE CONVERT(date, o.OrderDate) = (
    SELECT MAX(CONVERT(date, OrderDate))
    FROM northwind.dbo.Orders
    WHERE EmployeeID = o.EmployeeID
      AND YEAR(OrderDate) = YEAR(o.OrderDate)
      AND MONTH(OrderDate) = MONTH(o.OrderDate)
)
ORDER BY o.EmployeeID, o.OrderDate;

这三种方法都能实现需求:窗口函数写法最简洁,CTE方式可读性更强,子查询适合简单场景,你可以根据实际情况选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:00:59