小弟新手第一帖求一段SQL代码,好心请多多帮忙
有以下表
真实槽号 序列号 开始时间 结束时间 记录
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_2
FETCH next FROM #cur_1
INTO @X
END
--循环1结束
CLOSE #cur_1
DEALLOCATE #cur_1
[解决办法]
终于看明白了
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
*/