SQL Server提取客户最早开始日期与最晚结束日期的查询问题
问题解决:SQL Server 提取客户最早开始日期和最晚结束日期
问题描述
我在SQL Server数据库中有一张Contracts表,数据如下:
| 客户编号 | 开始日期 | 结束日期 |
|---|---|---|
| Customer1 | 01/01/2020 | 31/12/2020 |
| Customer1 | 01/01/2023 | 31/12/2023 |
| Customer 2 | 01/01/2024 | 01/01/2024 |
| Customer 2 | 01/01/2022 | 31/12/2022 |
| Customer 2 | 01/01/2020 | 31/12/2020 |
| Customer 3 | 01/01/2023 | 31/12/2023 |
需要提取唯一客户,并为每个客户返回最早的开始日期和最晚的结束日期,期望结果:
| 客户编号 | 开始日期 | 结束日期 |
|---|---|---|
| Customer1 | 01/01/2020 | 31/12/2023 |
| Customer2 | 01/01/2020 | 31/12/2024 |
| Customer3 | 01/01/2023 | 31/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
相关产品推荐
相关产品推荐

