我有这个SQL:
Select history.date, history.rasID, status.status
From RAS_RASHistory as history
inner join RAS_Status as status on History.statusID = status.statusID
Where history.date between @startDate
and @endDate and history.statusID in (select value from @status)
order by rasID, history.date desc
当我执行它时,我得到了这些结果:
date rasID status
2011-11-17 14:15:21.693 10000 Planning
2011-11-17 14:14:53.177 10000 New
2011-11-16 08:39:47.770 10000 New
2011-11-16 09:18:50.630 10001 New
2011-11-16 11:26:23.867 10002 Planning
2011-11-16 10:01:42.050 10002 Planning
2011-11-16 10:00:36.527 10002 New
我真正想要的是:
date rasID status
2011-11-17 14:15:21.693 10000 Planning
2011-11-16 09:18:50.630 10001 New
2011-11-16 11:26:23.867 10002 Planning
但我不确定如何去获取它。我认为一个子选择可能是方式,但我不太确定。有人能指出我正确的方向吗?
答案 0 :(得分:1)
;WITH x AS
(
Select h.[date], h.rasID, s.[status], -- please pick better column names!
rn = ROW_NUMBER() OVER (PARTITION BY h.rasID ORDER BY h.[date] DESC)
FROM dbo.RAS_RASHistory as h -- please use dbo prefix!
INNER JOIN dbo.RAS_Status as s -- please use manageable aliases!
ON h.statusID = s.statusID
Where h.date between @startDate and @endDate
and h.statusID in (select value from @status)
)
SELECT [date], rasID, [status]
FROM x
WHERE rn = 1
order by rasID, [date] desc;
Also please be very careful about BETWEEN
for date ranges
您也可以将其重写为:
;WITH h AS
(
SELECT [date], rasID, statusID,
rn = ROW_NUMBER() OVER (PARTITION BY rasID ORDER BY [date] DESC
FROM dbo.RAS_RASHistory
WHERE [date] BETWEEN @startDate AND @endDate
AND statusID IN (SELECT value FROM @status)
)
SELECT h.[date], h.rasID, s.[status]
FROM h INNER JOIN dbo.RAS_Status AS s
ON h.statusID = s.StatusID
AND h.rn = 1
ORDER BY h.rasID, h.[date] DESC;