2016-09-29 82 views
2

我有日期範圍的tableASQL服務器找到最近的日期範圍

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返回了一個與'有'相關的錯誤 - 聚合問題。

格拉西亞斯:)

+5

如果一行具有最大開始日期而另一行具有最大結束日期,該怎麼辦? –

+0

[SQL Server的可能的重複:只選擇MAX(DATE)行](https://stackoverflow.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate) – Vadzim

回答

2

你有一個where max(enddate)這是沒有意義的,你也不必通過,只需將項目列入你的小組開始日期/結束日期,所以嘗試:

select item, max(enddate), max(startdate) 
from tableA 
group by item 
0

你需要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 
0

這是一個經典的ARG-MAX的問題:您想用最新的開始日期行。

您需要將問題分成兩個步驟:

  1. 計算最近的開始日期爲每個項目。
  2. 將最大結果與原始表連接以獲得所需的行。

解決方案:

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; 

希望這能幫助你! :)