2013-03-29 50 views
1

我有这样的SQL: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

因此,获得最新的日期为每个'rasID',然后获取最新的'status' – Kermit

+0

需要更好地制定的要求。对于每个rasId条目你想要最近的状态。那是对的吗? – Brian

+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; 
+0

为什么括号约会?只是好奇。 –

+0

@Michael因为它是SQL Server中的一个关键字('date'是一种数据类型),并且如果您没有将它放在方括号中,它将在Management Studio中呈蓝色亮起。将来它可能会成为一个保留字,除了不必要的颜色之外,它还可以帮助您在将来打样。当然,最好的解决方案就是不要使用关键字作为模糊标识符(“WHAT”的“日期”)。 –

+0

这个伎俩!谢谢! –