在特定列中查找重复项目,并使用“ - ”更新MIN行号的项目

时间:2013-08-27 16:15:55

标签: sql-server-2008 tsql

数据看起来像这样:

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

2 个答案:

答案 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