0

数据看起来像这样:

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 行的StopTime相似。我想将其格式化为:

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
4

2 回答 2

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
于 2013-08-27T16:31:09.853 回答
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
于 2013-08-27T16:28:47.053 回答