数据库SQL Server 2000
共有记录40万条大概记录如下:编号 数字1 数字2 城市
1 100 200 北京
2 201 300 北京
3 50 150 北京
4 301 400 上海
…………………………
…………………………
现在需要的结果是将数据合并为:编号 数字1 数字2 城市
1 50 300 北京
2 301 400 上海就是将重复的数据合并且删除掉.
问题解决马上结帖
共有记录40万条大概记录如下:编号 数字1 数字2 城市
1 100 200 北京
2 201 300 北京
3 50 150 北京
4 301 400 上海
…………………………
…………………………
现在需要的结果是将数据合并为:编号 数字1 数字2 城市
1 50 300 北京
2 301 400 上海就是将重复的数据合并且删除掉.
问题解决马上结帖
SELECT ROWNUM,
MIN(数字1) OVER(PARTITION BY 城市) AS 数字1,
MAX(数字2) OVER(PARTITION BY 城市) AS 数字2
FROM TABLE
insert 临时表 select 数字1 = sum(数字1), 数字2 = sum(数字2), 城市 from 原表 group by 城市2.清空原表:
truncate table 原表3.编号改为自增字段,插入数据:
insert 原数据表 select * from 临时表
需要合并的条件是这样的:
1.要合并,首先城市必须是一样的
2.在记录集中,如果城市一样,且前一条记录的数字2与后一条记录的数字1相邻,那么他们就可以合并,否则不能合并.
比如有数字
第一条记录: 1、2、3、4、5 简写为:1-5
第二条记录: 6、7、8、9 简写为:6-9那么合并后的数据为:1-9
SQL语句:
SELECT MIN(数字1) AS 数字1, FC_GET(数字1, 城市) AS 数字2, 城市 FROM TABLE GROUP BY 城市
函数:(伪代码)
FC_GET(数字1, 城市)
{
DECLARE @num2 int
SELECT TOP 1 @num2=数字2 FROM TABLE WHERE 数字2>数字1 AND 城市=城市 ORDER BY 数字2
然后使用 while 一直查找到最高层的数字2
}
比如有数字
第一条记录: 1、2、3、4、5 简写为:1-5
第二条记录: 6、7、8、9 简写为:6-9那么合并后的数据为:1-9
declare @num1 int,@num2 int,@address char(10)
declare @num10 int,@num20 int,@address0 char(10)
declare @id int
set @id=1
create table testb (id int,num1 int,num2 int,address char(10))
declare mycur cursor for select 数字1,数字2,城市 from test order by 城市,数字1
open mycur
fetch next from mycur into @num1,@num2,@address
while @@fetch_status=0
begin
fetch next from mycur into @num10,@num20,@address0
if @num2=@num10-1 and @address=@address0 set @num2=@num20
else
begin
--如果你的表编号设置为自动增加的,则不要插入@id
insert into testb values (@id,@num1,@num2,@address)
set @id=@id+1
set @num1=@num10
set @num2=@num20
set @address=@address0
end
end
close mycur
deallocate mycur
delete from test
--如果你的表编号设置为自动增加的,则不要插入编号,用以下注释的语句
--insert into test select num1,num2,address from testb
insert into test select * from testb
drop table testb