SQL服务器找到最近的日期范围
问题描述:
我有日期范围的tableA
:SQL服务器找到最近的日期范围
tranid item startdate enddate
---------------------------------------
1 A 1/1/2000 2/2/2005
2 A 5/1/2000 2/2/2005
3 B 7/8/2015 9/8/2015
4 C 4/10/2007 7/20/2008
5 C 4/10/2003 7/20/2005
如何写一个SQL查询,只选择最近的交易(如最近的开始和结束日期)?
例如,对于A,最近的日期范围是5/1/2000到2/2/2005,对于C,最近的日期范围是C 4/10/2007到7/20/2008。
我完全没有写这个,因为它看起来很容易,但不是。
select item, max(enddate), max(startdate)
from tableA
where max(enddate)
group by item, enddate, startdate
SQL Server返回了一个与'有'相关的错误 - 聚合问题。
格拉西亚斯:)
答
你有一个where max(enddate)
这是没有意义的,你也不必通过,只需将项目列入你的小组开始日期/结束日期,所以尝试:
select item, max(enddate), max(startdate)
from tableA
group by item
答
你需要ROW_NUMBER
窗函数
:with cte as
(
Select Row_Number() Over(Partition by item order by startdate desc) RN,*
From yourtable
)
Select *
From cte
Where RN = 1
答
这是一个经典的ARG-MAX的问题:您想用最新的开始日期行。
您需要将问题分成两个步骤:
- 计算最近的开始日期为每个项目。
- 将最大结果与原始表连接以获得所需的行。
解决方案:
SELECT b.tranid, b.item, a.maxstartdate, b.enddate
FROM
(SELECT t.item, MAX(t.startdate) maxstartdate
FROM t
GROUP BY t.item) a
JOIN t b
ON a.maxstartdate = b.startdate AND a.item = b.item;
希望这能帮助你! :)
如果一行具有最大开始日期而另一行具有最大结束日期,该怎么办? –
[SQL Server的可能的重复:只选择MAX(DATE)行](https://*.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate) – Vadzim