Sql server D及其日期范围为2010年2月20日至2010年2月22日的记录。它应该向我显示ID=A的结果是激活的,ID=B的结果是激活的,ID=C的结果是激活的。此处ID=C不能处于非活动状态,因为它在7月份变为非活动状态。考虑我的日期栏作为日期DATATYPEI非

Sql server D及其日期范围为2010年2月20日至2010年2月22日的记录。它应该向我显示ID=A的结果是激活的,ID=B的结果是激活的,ID=C的结果是激活的。此处ID=C不能处于非活动状态,因为它在7月份变为非活动状态。考虑我的日期栏作为日期DATATYPEI非,sql-server,sql-server-2008,sql-server-2005,Sql Server,Sql Server 2008,Sql Server 2005,D及其日期范围为2010年2月20日至2010年2月22日的记录。它应该向我显示ID=A的结果是激活的,ID=B的结果是激活的,ID=C的结果是激活的。此处ID=C不能处于非活动状态,因为它在7月份变为非活动状态。考虑我的日期栏作为日期DATATYPEI非常感谢你给我的时间。期待solution@Afaq:好的,我的解决方案可以很容易地扩展到多个ID:只需将按ID划分添加到RankOverall计算中,并在RankByStatus的计算中将按状态划分更改为按ID划分,状态。不过,您对原始问题的第


D及其日期范围为2010年2月20日至2010年2月22日的记录。它应该向我显示ID=A的结果是激活的,ID=B的结果是激活的,ID=C的结果是激活的。此处ID=C不能处于非活动状态,因为它在7月份变为非活动状态。考虑我的日期栏作为日期DATATYPEI非常感谢你给我的时间。期待solution@Afaq:好的,我的解决方案可以很容易地扩展到多个ID:只需将
按ID划分
添加到
RankOverall
计算中,并在
RankByStatus
的计算中将
按状态划分
更改为
按ID划分,状态
。不过,您对原始问题的第二次更改似乎更为重要,可能需要另一个解决方案(这意味着您可能需要将其作为新问题提出)。
ID     DATE           TIME     STATUS 
---------------------------------------------
A      01-01-2000     0900     ACTIVE 
A      05-02-2000     1000     INACTIVE 
A      01-07-2000     1300     ACTIVE 
B      01-05-2005     1000     ACTIVE 
B      01-08-2007     1050     ACTIVE
C      01-01-2010     0900     ACTIVE 
C      01-07-2010     1900     INACTIVE
A      05-02-2000     1000     INACTIVE 
A      05-02-2000     1000     INACTIVE 
A      01-07-2000     1300     ACTIVE 
SELECT ID, Date, Time, Status
 from (select ID, Date, Time, Status, row_number() over (order by Date) Ranking
        from MyTable
        where ID = @SearchId
         and Date <= @SearchDate) xx
 where Ranking < 3
 order by Date, Time
SELECT ID, Date, Time, Status
 from (select
          ID, Date, Time, Status
         ,row_number() over (partition by case when Date = @SearchDate then 0 else 1 end
                             order by     case when Date = @SearchDate then 0 else 1 end
                                         ,Date) Ranking
        from MyTable
        where ID = @SearchId
         and Date <= @SearchDate) xx
 where Ranking = 1
 order by Date, Time
WITH ranked AS (
  SELECT
    ID,
    Date,
    Time,
    Status,
    RankOverall  = ROW_NUMBER() OVER (                    ORDER BY Date DESC),
    RankByStatus = ROW_NUMBER() OVER (PARTITION BY Status ORDER BY Date DESC)
  FROM Activity
  WHERE ID = @ID
    AND Date <= @Date
)
SELECT
  ID,
  Date,
  Time,
  Status,
FROM ranked
WHERE RankOverall = 1
   OR Status = 'INACTIVE' AND RankByStatus = 1