数据看起来像这样:
RN StartTime StopTime Activity
1 2013-02-03 12:07:39 2013-02-03 14:58:13 A1
2 2013-02-03 16:00:02 2013-02-04 04:25:32 A2
3 2013-02-04 04:25:32 2013-02-04 04:25:32 A2
4 2013-02-04 05:31:32 2013-02-04 05:57:32 A3
5 2013-02-04 06:24:32 2013-02-04 06:54:32 A4
第3行中的 StartTime 和第2行中的停止时间& 3是类似的。 我想将它格式化为:
RN StartTime StopTime Activity
1 2013-02-03 12:07:39 2013-02-03 14:58:13 A1
2 2013-02-03 16:00:02 - A2
3 - 2013-02-04 04:25:32 A2
4 2013-02-04 05:31:32 2013-02-04 05:57:32 A3
5 2013-02-04 06:24:32 2013-02-04 06:54:32 A4
StartTime 问题是使用CASE语句解决的,但我需要在 StopTime 中找到副本,并使用' - '更新RN较小的那个。
注意:重复项的活动总是相同。
这是我的疑问:
SELECT CTE.RN,
(CASE
WHEN CONVERT(VARCHAR, StartTime, 120) = CONVERT(VARCHAR, StopTime, 120)
THEN '-'
ELSE CONVERT(VARCHAR, StartTime, 120)
END) As StartTime, StopTime
FROM CTE
ORDER BY StopTime
答案 0 :(得分:1)
基本问题是,您想要比较的值,以便在停止时间列中生成相应的“ - ”,这是通过向前看一行获得的。你可以通过使用具有正确标准的连接来实现这一点...如果它可以使用RN + 1,你可以将表格加入到自身,其中a.RN + 1 = b.RN.然后,您将能够在a.StopTime = b.StartTime上使用CASE来确定是否应该使用' - '。
SELECT a.RN
,CASE WHEN CONVERT(VARCHAR,a.StartTime,120) = CONVERT(VARCHAR,a.StopTime,120)
THEN '-'
ELSE CONVERT(VARCHAR,a.StartTime,120)
END StartTime
,CASE WHEN CONVERT(VARCHAR,a.StopTime,120) = CONVERT(VARCHAR,b.StartTime,120)
THEN '-'
ELSE CONVERT(VARCHAR,a.StopTime,120)
END StopTime
FROM CTE a
LEFT JOIN CTE b on a.RN+1 = b.RN
答案 1 :(得分:1)
SELECT CTE.RN,
(CASE
WHEN c1.StartTime = c1.StopTime
THEN '-'
ELSE CONVERT(VARCHAR, c1.StartTime, 120)
END) As StartTime,
CASE WHEN c1.StopTime = c2.StartTime THEN '-' ELSE CONVERT(VARCHAR, c1.StopTime, 120) END AS StopTime
FROM CTE C1
LEFT JOIN CTE c2
ON c2.RN = c1.RN + 1
ORDER BY c1.StopTime