SQL:sub选择日期

时间:2013-03-29 19:14:05

标签: sql-server subquery

我有这个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

但我不确定如何去获取它。我认为一个子选择可能是方式,但我不太确定。有人能指出我正确的方向吗?

1 个答案:

答案 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;