有以下表
真实槽号 序列号 开始时间 结束时间 记录
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
真实槽号 序列号 开始时间 结束时间 记录
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
select 真实槽号,
开始时间=min(开始时间),
结束时间=max(结束时间)
from T
group by 真实槽号
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)
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
*/
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.真实槽号)
是不是你啊搂住
以下表为例(后续还有诸多记录)
真实槽号 序列号 开始时间 结束时间 记录
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点……很头疼。
开始时间和结束时间都要最小的啊
那么用这个就可以了DELETE @DATA
FROM @DATA AS A
WHERE 开始时间 > (SELECT MIN(开始时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
OR 结束时间 < (SELECT MIN(结束时间) FROM @DATA WHERE 真实槽号 = A.真实槽号)
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
*/
(第一句和第二句倒是可以换的)
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分给出去 呵呵)
2、还有请问怎么把这50分给出去 呵呵页面上方的蓝色菜单条里面有一个“管理”