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

SQL Server提取客户最早开始日期与最晚结束日期的查询问题

问题解决:SQL Server 提取客户最早开始日期和最晚结束日期

问题描述

我在SQL Server数据库中有一张Contracts表,数据如下:

客户编号开始日期结束日期
Customer101/01/202031/12/2020
Customer101/01/202331/12/2023
Customer 201/01/202401/01/2024
Customer 201/01/202231/12/2022
Customer 201/01/202031/12/2020
Customer 301/01/202331/12/2023

需要提取唯一客户,并为每个客户返回最早的开始日期和最晚的结束日期,期望结果:

客户编号开始日期结束日期
Customer101/01/202031/12/2023
Customer201/01/202031/12/2024
Customer301/01/202331/12/2023

我尝试了以下查询,但返回数据不正确且遗漏部分客户:

Select CustomerNo, StartDate, EndDate 
 FROM [Database].dbo.[Contracts] cont
 WHERE 
    StartDate=(
        SELECT MIN(StartDate)
        FROM [Database].dbo.[Contracts]
        WHERE CustVendNo = cont.CustVendNo
        GROUP BY CustVendNo)
AND 
EndDate=(
        SELECT MAX(EndDate)
        FROM [Database].dbo.[Contracts]
        WHERE CustVendNo = cont.CustVendNo
        GROUP BY CustVendNo)

问题原因

你的查询逻辑是找同一行同时包含该客户最小开始日期和最大结束日期的记录,但大部分客户的这两个日期并不在同一条合同里,所以会查不到数据,甚至遗漏客户。另外原查询中使用的CustVendNo和表结构里的客户编号(对应CustomerNo)字段名不匹配,也会导致查询异常。

正确解决方案

直接用GROUP BY按客户编号分组,配合聚合函数MIN()和MAX()计算所需日期,这是最直接高效的写法:

SELECT 
    CustomerNo,
    MIN(StartDate) AS 开始日期,
    MAX(EndDate) AS 结束日期
FROM [Database].dbo.[Contracts]
GROUP BY CustomerNo
ORDER BY CustomerNo;

补充说明

  • 确保字段名和实际表一致,避免因字段名不匹配导致的查询错误。
  • 如果日期字段存储为字符串类型,建议改为DATE或DATETIME类型,避免字符串排序逻辑错误导致的日期计算偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:17:49