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