我有一个包含状态更新的平面表。
这些更新以下列格式存储:
协议ID | 状态ID | 状态日期
源数据:
AgreementID StatusID StatusDate
109 1 14/01/2013 15:00:33
109 2 14/01/2013 15:01:28
109 2 14/01/2013 15:01:28
109 2 14/01/2013 15:02:42
109 2 26/02/2013 16:27:38
109 2 26/02/2013 16:27:45
109 8 19/02/2013 13:57:33
109 8 04/03/2013 16:46:29
109 8 18/03/2013 14:08:12
109 8 18/03/2013 14:47:00
109 8 18/03/2013 14:48:46
109 9 26/03/2013 15:41:51
我需要的是在日期范围内映射协议状态,一个协议可以有同一个 StatusID 的多个状态更新,但是一旦协议进入下一个 StatusID,它就不能退回到以前的状态 ID。
对于最后一个状态,日期范围应为 StatusDate To Date。
我有以下一段代码,但结果并没有给我想要的东西......
SELECT
AgreementID,
CONVERT(datetime, CONVERT(varchar(10), StatusDate, 103), 103) AS StatusDate,
CONVERT(datetime, CONVERT(varchar(10), StatusDate, 103), 103) AS DateFrom,
CASE WHEN DateTo IS NULL THEN CONVERT(datetime, CONVERT(varchar(10), GETDATE(), 103), 103) ELSE CONVERT(datetime, CONVERT(varchar(10), DateTo, 103), 103) END AS DateTo,
StatusID
FROM
(
SELECT
AgreementID,
StatusID,
StatusDate,
(SELECT TOP (1) StatusDate FROM TblStatusUpdates AS SU WHERE SU.AgreementID = U.AgreementID AND SU.StatusDate > U.StatusDate ORDER BY StatusID, StatusDate ASC) DateTo,
RN = ROW_NUMBER() OVER (Partition BY AgreementID ORDER BY StatusDate)
FROM
(
SELECT
AgreementID,
StatusID,
MIN(StatusDate) AS StatusDate
FROM
TblStatusUpdates
GROUP BY
AgreementID, StatusID
) AS U
) AS A
以下是此查询的示例结果:
AgreementID StatusDate DateFrom DateTo StatusID
109 14/01/2013 14/01/2013 14/01/2013 1
109 14/01/2013 14/01/2013 14/01/2013 2
109 19/02/2013 19/02/2013 26/02/2013 8
109 26/03/2013 26/03/2013 25/04/2013 9
如您所见,Date To Value 不正确,它应该始终运行到下一个状态 ID 的前一天。
所以在这个例子中,状态 2 应该从 19/02/2013 到 18/02/13
任何建议都会很棒。谢谢你。