有以下表
真实槽号 序列号 开始时间 结束时间 记录
101       123      5:00  NULL     1
101       124      6:00  NULL     1
101       125      NULL   7:00    0
101       126      NULL   7:50    0
101       127      NULL   7:55    0
102       128      NULL   7:58    1
……
……
如何做才能将多个个结束时间/开始时间 除最开始行之外的都删除,只保留一个开始和对应的结束时间
双游标 谢谢下面自己写的程序无法搞定,不知道问题出在什么地方。
--下面要删除多余项,要每个开始时间只对应一个结束时间
--@X@Y变量用来存放开始和结束时间Declare @X int
Declare @Y int/*--故障类型
Declare @fault_type varchar(50)
--故障序列号
Declare @fault_rs int
--故障真实槽号
Declare @fault_real_no int
*/
--声明游标1
Declare #cur_1 cursor scroll
for select 变量
from Report open  #cur_1 FETCH first FROM #cur_1
INTO @X--循环1
WHILE @@FETCH_STATUS=0
  BEGIN
   --声明游标2  
     Declare #cur_2  cursor scroll dynamic
     for select 变量
     from Report      open  #cur_2      FETCH RELATIVE 1 FROM #cur_2
     INTO @Y
  --循环2
   WHILE @@FETCH_STATUS=0
    BEGIN
     if @X=@Y
       DELETE from Report WHERE CURRENT OF #cur_2  
       FETCH NEXT FROM #cur_2
       INTO @Y
     if @X!=@Y
        break
    END
   --循环2结束
       CLOSE #cur_2
       DEALLOCATE #cur_2FETCH next FROM #cur_1
INTO @X
END
  --循环1结束
    CLOSE #cur_1
    DEALLOCATE #cur_1

解决方案 »

  1.   

    --try
    select 真实槽号,
    开始时间=min(开始时间),
    结束时间=max(结束时间)
    from T
    group by 真实槽号
      

  2.   

    --这样是LZ想要的结果吗?create table T(真实槽号 int, 序列号 int, 开始时间 varchar(10), 结束时间 varchar(10), 记录 bit)
    insert T select 101,       123,      '5:00',  NULL,     1
    union all select 101,       124,      '6:00',  NULL,     1
    union all select 101,       125,      NULL,   '7:00',    0
    union all select 101,       126,      NULL,   '7:50',    0
    union all select 101,       127,      NULL,   '7:55',    0
    union all select 102,       128,      NULL,   '7:58',    1
    select 真实槽号,
    开始时间=min(开始时间),
    结束时间=max(结束时间)
    from T
    group by 真实槽号--result
    真实槽号        开始时间       结束时间       
    ----------- ---------- ---------- 
    101         5:00       7:55
    102         NULL       7:58(2 row(s) affected)
      

  3.   

    是删除还是要查询??查询的话,楼上的就可以了删除的话,用这个
    DECLARE @DATA TABLE(真实槽号 INT, 序列号 INT, 开始时间 VARCHAR(10), 结束时间 VARCHAR(10), 记录 BIT)
    INSERT INTO @DATA 
    SELECT 101, 123, '5:00', NULL, 1
    UNION
    SELECT 101, 124, '6:00', NULL, 1
    UNION
    SELECT 101, 125, NULL, '7:00', 0
    UNION
    SELECT 101, 126, NULL, '7:50', 0
    UNION
    SELECT 101, 127, NULL, '7:55', 0
    UNION
    SELECT 102, 128, NULL, '7:58', 1
    DELETE @DATA FROM @DATA AS A WHERE 开始时间 > (SELECT MIN(开始时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
    DELETE @DATA FROM @DATA AS A WHERE 结束时间 < (SELECT MAX(结束时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
    SELECT * FROM @DATA/*
    真实槽号   序列号   开始时间   结束时间   记录
    101       123      5:00      NULL      1
    101       127      NULL       7:55     0
    102       128      NULL       7:58     1
    */
      

  4.   

    当然也可以把那两句DELETE的SQL写到一些DELETE @DATA FROM @DATA AS A WHERE 开始时间 > (SELECT MIN(开始时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
    DELETE @DATA FROM @DATA AS A WHERE 结束时间 < (SELECT MAX(结束时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)-->DELETE @DATA
    FROM @DATA AS A 
    WHERE 开始时间 > (SELECT MIN(开始时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
    OR 结束时间 < (SELECT MAX(结束时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
      

  5.   

    你可以将其实时间和结束时间查询出来分表看作一个虚拟表,然后将这两个表inner连接,求出起始时间和结束时间差最大的,在通过联合查询,将其他时间给删除。自己试试吧!
      

  6.   

    我好像在baidu知道里面碰到了这个问题
    是不是你啊搂住
      

  7.   

    谢谢大家的帮忙!刚刚学用SQL不长时间,很多东西不懂,第一帖就能得到这么多有意义的指点真的感到……挺激动的!谢谢各位了帖子的表述有问题,实际是想将真实槽号相同的(比如都是101)记录,取出其相应的开始时间和结束时间
    以下表为例(后续还有诸多记录)
    真实槽号 序列号 开始时间 结束时间 记录
    101       123      5:00  NULL     1
    101       124      6:00  NULL     1
    101       125      NULL   7:00    0
    101       126      NULL   7:50    0
    101       127      NULL   7:55    0
    102       128      NULL   7:58    0
    102       129      7:59   NULL     1
    102       130      8:00   NULL     1
    102       131      NULL   8:55    0
    102       132      NULL   8:58    0结果应该是这样的
    真实槽号 序列号 开始时间 结束时间 记录
    101       123      5:00  NULL     1101       125      NULL   7:00    0102       129      7:59   NULL     1102       131      NULL   8:55    0
    就是对于同是101的槽号,每个唯一的开始时间都对应一个唯一的结束时间楼上的朋友们提出的方法多是直接查询的,问题的关键是同是对于101开始时间可能有多个,结束时间也可能有多个,如何让它们对应起来(并将多于的数据清掉)。我原来的想法是这样的:用两个游标,第一个游标取第一行,第二个取相对位置到第二行,将两行比较,如果记录不同,就让游标一向下走一行,游标二也向下相对走一行,再比较,如果结果相同,就删除游标二所在的行,并让游标二向下走,比较……直到记录不同为止,跳出游标二的循环,再让游标一向下走,重复比较……。我觉得自己的方法很麻烦,而且自己编的程序也不能实现,前天写到凌晨3点……很头疼。
      

  8.   


    开始时间和结束时间都要最小的啊
    那么用这个就可以了DELETE @DATA
    FROM @DATA AS A 
    WHERE 开始时间 > (SELECT MIN(开始时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
    OR 结束时间 < (SELECT MIN(结束时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
      

  9.   

    终于看明白了DECLARE @DATA TABLE(真实槽号 INT, 序列号 INT, 开始时间 VARCHAR(10), 结束时间 VARCHAR(10), 记录 BIT)
    INSERT INTO @DATA 
    SELECT 101, 123, '5:00', NULL, 1
    UNION
    SELECT 101, 124, '6:00', NULL, 1
    UNION
    SELECT 101, 125, NULL, '7:00', 0
    UNION
    SELECT 101, 126, NULL, '7:50', 0
    UNION
    SELECT 101, 127, NULL, '7:55', 0
    UNION
    SELECT 102, 128, NULL, '7:58', 0
    UNION
    SELECT 102, 129, '7:59', NULL,  1
    UNION
    SELECT 102, 130, '8:00', NULL,  1
    UNION
    SELECT 102, 131, NULL, '8:55', 0
    UNION
    SELECT 102, 132, NULL, '8:58', 0
    DELETE @DATA FROM @DATA AS A WHERE 开始时间 > (SELECT MIN(开始时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
    DELETE @DATA FROM @DATA AS A WHERE 序列号 < (SELECT MIN(序列号) FROM @DATA WHERE 真实槽号 = A.真实槽号 AND 结束时间 IS NULL) 
    DELETE @DATA FROM @DATA AS A WHERE 结束时间 > (SELECT MIN(结束时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)SELECT * FROM @DATA/*
    真实槽号   序列号   开始时间   结束时间   记录
    101       123      5:00     NULL       1
    101       125      NULL      7:00      0
    102       129      7:59      NULL       1
    102       131      NULL      8:55      0
    */
      

  10.   

    不过DELETE语句的顺序不要变哦
    (第一句和第二句倒是可以换的)
      

  11.   

    谢谢楼上朋友,程序OK,原理我也明白了,没想到可以这样简单只是对于同一个故障当有多个开始时间和结束时间的时候,按照这个方法还能够继续延伸么?(如下例)
    101       123      5:00  NULL     1
    101       125      NULL   7:00    0
    101       126      NULL   7:50    0
    102       129      7:59   NULL     1
    102       130      8:00   NULL     1
    102       131      NULL   8:55    0
    102       132      NULL   8:58    0
    102       133      9:00  NULL     1
    102       134      NULL   9:50    0
    102       135      NULL   9:55    0
    ………………………………………………(还有请问怎么把这50分给出去 呵呵)
      

  12.   

    1、只是对于同一个故障当有多个开始时间和结束时间的时候,按照这个方法还能够继续延伸么?如果我没有理解错误的话,上面的delete语句是可以解决这个问题的
    2、还有请问怎么把这50分给出去 呵呵页面上方的蓝色菜单条里面有一个“管理”
      

  13.   

    换种思路,选出来后再删除以前的表就可以了,供参考:select * from 表 A where 开始时间 = (select min(开始时间) from 表  where 真实槽号 = A.真实槽号 group by 开始时间)group by 真实槽号union select * from 表 A where 结束时间 = (select min(结束时间) from 表  where 真实槽号 = A.真实槽号 group by 结束时间)group by 真实槽号