Tsql 从具有多行相似信息的表中选择Max(日期)

Tsql 从具有多行相似信息的表中选择Max(日期),tsql,stored-procedures,Tsql,Stored Procedures,我试图在一个表中选择最新的状态更改,该表记录了所有状态更改,并且位于两个日期参数之间 但是,它选择返回的所有行,并且不在我指定的日期内 Declare @Rangefrom date, @Rangetill date; SET @rangefrom = DATEADD(day, -50, GETDATE()) SET @Rangetill = DATEADD(day, -90, GETDATE()) Select a.Candidate , a.Newstatus , @r

我试图在一个表中选择最新的状态更改,该表记录了所有状态更改,并且位于两个日期参数之间

但是,它选择返回的所有行,并且不在我指定的日期内

    Declare 
@Rangefrom date,
@Rangetill date;

SET @rangefrom = DATEADD(day, -50, GETDATE()) 
SET @Rangetill = DATEADD(day, -90, GETDATE())

Select 
  a.Candidate
, a.Newstatus
, @rangefrom
, a.date
, @rangetill
, a.Consultant

From AppStatusHistory as A
WHERE newstatus = 'Working Compliant' OR newstatus = 'Registered Compliant'
AND A.Date BETWEEN @rangefrom AND  @Rangetill
AND A.Date = (select max(B.date)
                from AppStatusHistory AS B
                where B.Candidate = a.Candidate)

根据我的理解,这应该选择介于@rangefrom和@rangetill之间的a.date=MAX(b.date)。

Where
条件应该是:
Where(newstatus='Working compliance'或newstatus='registed compliance).


您需要小心使用
,缺少新闻状态选择条件的
()
。如果不添加,则
将返回更多结果。

我认为查询确实满足了您的要求,只是在@rangefrom>@rangeuntil的情况下,您可能希望交换变量声明中的值。

谢谢,在这种情况下,添加()将完全更改返回的数据(它不会返回任何内容)这是预期的SQL行为吗?您已替换了日期值@rangefrom应该是DATEADD(day,-90,GETDATE()),我怀疑这是否符合您的想法。并且是在或之前的进程。谢谢,在这种情况下,添加()会完全更改返回的数据(它不会返回任何内容)。这是预期的SQL行为吗?如果它不会返回任何内容,那么您应该假设没有记录匹配,但您可以验证它:)返回0记录并不意味着它不是正确的行为,您不能在它们之间放置等号。当我查看数据时(在前端ui中,使用“从AppStatusHistory中选择*”)我可以看出我在这个查询中所说的是真的,或者数据在那里。我是否可以安全地认为我可能写错了查询?声明的顺序在SQL中重要吗?我不认为重要。@A.Chandler-1如果可以,您是否可以提供更多。rangeuntil在rangefrom之前。或者首先处理。