咨询在SQL里,如何在一定条件下更新部分字段

qq_22190287 2014-10-20 12:37:52
有下面一组数据:
2014-9-1 10:20
2014-9-1 10:28
2014-9-1 8:30
2014-9-1 9:01
2014-9-1 9:28
2014-9-1 9:37
2014-9-1 8:46
2014-9-1 8:18
请问下如何按时间顺序更新前5行,并把2014-9-1更改为2014-9-5
达到如下效果
2014-9-5 8:18
2014-9-5 8:30
2014-9-5 8:46
2014-9-5 8:51
2014-9-5 9:01
2014-9-1 9:07
2014-9-1 9:15
2014-9-1 9:28
2014-9-1 9:37

...全文
283 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
习惯性蹭分 2014-10-23
  • 打赏
  • 举报
回复
需2005及以上版本

use tempdb
create table test1(d1 datetime)
go
insert into test1(d1) values('2014-9-1 10:20')
insert into test1(d1) values('2014-9-1 10:28')
insert into test1(d1) values('2014-9-1 8:30')
insert into test1(d1) values('2014-9-1 9:01')
insert into test1(d1) values('2014-9-1 9:28')
insert into test1(d1) values('2014-9-1 9:37')
insert into test1(d1) values('2014-9-1 8:46')
insert into test1(d1) values('2014-9-1 8:18')

select * from test1
update t set d1=dateadd(dd,4,d1)
from (select top 5 * from test1 order by d1 desc) t

select * from test1 order by d1 desc

 
qlh 2014-10-23
  • 打赏
  • 举报
回复
说明,上面是sql2005及以后版本的,update和delete可以用cte先查询数据,在修改
qlh 2014-10-23
  • 打赏
  • 举报
回复
create table test1(d1 datetime , d2 datetime)
go
insert into test1(d1) values('2014-9-1 10:20')
insert into test1(d1) values('2014-9-1 10:28')
insert into test1(d1) values('2014-9-1 8:30')
insert into test1(d1) values('2014-9-1 9:01')
insert into test1(d1) values('2014-9-1 9:28')
insert into test1(d1) values('2014-9-1 9:37')
insert into test1(d1) values('2014-9-1 8:46')
insert into test1(d1) values('2014-9-1 8:18')
with temp as 
(select * from (select d1,row_number() over(order by d1) as num
from test1) a where num<=5)
update temp set d1=dateadd(d,datediff(d,d1,'2014-09-05'),d1)
还在加载中灬 2014-10-20
  • 打赏
  • 举报
回复
有其它辅助自段吗
freecodex 2014-10-20
  • 打赏
  • 举报
回复
用ROW_NUMBER()函数按时间排序后多生成一列,然后使用多生成的一列作为条件更新
xiaodongni 2014-10-20
  • 打赏
  • 举报
回复
你这个表有主键吗 如果有的话 就比较好改了。

update  tablename 
set date='2014-9-5'
from (select top  5 * from tablename 
order by  date  desc) as t
where t.id=tablename.id
如果没有ID 就比较麻烦一点。需要自己建立一个RN 唯一标示各列。然后在匹配。
还在加载中灬 2014-10-20
  • 打赏
  • 举报
回复
要嘛,数据不多的话,可以用临时,再倒表~~
还在加载中灬 2014-10-20
  • 打赏
  • 举报
回复
呃,有重复就不能区别了~~ 要按你指定的列排序方式并TOP 更新一定的数据,需要一个不是所更新的列且可以让一条记录区别于其它记录的字段
qq_22190287 2014-10-20
  • 打赏
  • 举报
回复
引用 7 楼 ky_min 的回复:
就是可以区别两条记录的 主键 或 ID 之类的字段
有区别的id啊。但是1号和5号的id有重复。 主要想实现的作用就把1号的数据按id拷贝到5号去,并修改时间。
还在加载中灬 2014-10-20
  • 打赏
  • 举报
回复
就是可以区别两条记录的 主键 或 ID 之类的字段
卖水果的net 2014-10-20
  • 打赏
  • 举报
回复
引用 4 楼 qq_22190287 的回复:
这个肯定不行啊。我只是选取了几个数字。实际数据表中有几百条呢。 [quote=引用 3 楼 wmxcn2000 的回复:]

-- 用top ,假定这个时间没有重复的。
create table test(d1 datetime , d2 datetime)
go
insert into test(d1) values
('2014-9-1 10:20'),
('2014-9-1 10:28'),
('2014-9-1 8:30'),
('2014-9-1 9:01'),
('2014-9-1 9:28'),
('2014-9-1 9:37'),
('2014-9-1 8:46'),
('2014-9-1 8:18')
go
update test set d2 = d1 
go
update test set d1 = DATEADD(DAY,4,d1) 
where d1 in (select top 5 d1 from test order by d1)
go
select d1 新值 , d2 原来的值 from test order by d1 
go
新值                      原来的值
----------------------- -----------------------
2014-09-01 09:37:00.000 2014-09-01 09:37:00.000
2014-09-01 10:20:00.000 2014-09-01 10:20:00.000
2014-09-01 10:28:00.000 2014-09-01 10:28:00.000
2014-09-05 08:18:00.000 2014-09-01 08:18:00.000
2014-09-05 08:30:00.000 2014-09-01 08:30:00.000
2014-09-05 08:46:00.000 2014-09-01 08:46:00.000
2014-09-05 09:01:00.000 2014-09-01 09:01:00.000
2014-09-05 09:28:00.000 2014-09-01 09:28:00.000

(8 行受影响)


[/quote] 就是 10W 条数据,也是这个道理,你说说哪里不行,我再想办法。
qq_22190287 2014-10-20
  • 打赏
  • 举报
回复
引用 2 楼 ky_min 的回复:
有其它辅助自段吗
需要什么样的辅助字段?
qq_22190287 2014-10-20
  • 打赏
  • 举报
回复
这个肯定不行啊。我只是选取了几个数字。实际数据表中有几百条呢。
引用 3 楼 wmxcn2000 的回复:

-- 用top ,假定这个时间没有重复的。
create table test(d1 datetime , d2 datetime)
go
insert into test(d1) values
('2014-9-1 10:20'),
('2014-9-1 10:28'),
('2014-9-1 8:30'),
('2014-9-1 9:01'),
('2014-9-1 9:28'),
('2014-9-1 9:37'),
('2014-9-1 8:46'),
('2014-9-1 8:18')
go
update test set d2 = d1 
go
update test set d1 = DATEADD(DAY,4,d1) 
where d1 in (select top 5 d1 from test order by d1)
go
select d1 新值 , d2 原来的值 from test order by d1 
go
新值                      原来的值
----------------------- -----------------------
2014-09-01 09:37:00.000 2014-09-01 09:37:00.000
2014-09-01 10:20:00.000 2014-09-01 10:20:00.000
2014-09-01 10:28:00.000 2014-09-01 10:28:00.000
2014-09-05 08:18:00.000 2014-09-01 08:18:00.000
2014-09-05 08:30:00.000 2014-09-01 08:30:00.000
2014-09-05 08:46:00.000 2014-09-01 08:46:00.000
2014-09-05 09:01:00.000 2014-09-01 09:01:00.000
2014-09-05 09:28:00.000 2014-09-01 09:28:00.000

(8 行受影响)


卖水果的net 2014-10-20
  • 打赏
  • 举报
回复

-- 用top ,假定这个时间没有重复的。
create table test(d1 datetime , d2 datetime)
go
insert into test(d1) values
('2014-9-1 10:20'),
('2014-9-1 10:28'),
('2014-9-1 8:30'),
('2014-9-1 9:01'),
('2014-9-1 9:28'),
('2014-9-1 9:37'),
('2014-9-1 8:46'),
('2014-9-1 8:18')
go
update test set d2 = d1 
go
update test set d1 = DATEADD(DAY,4,d1) 
where d1 in (select top 5 d1 from test order by d1)
go
select d1 新值 , d2 原来的值 from test order by d1 
go
新值                      原来的值
----------------------- -----------------------
2014-09-01 09:37:00.000 2014-09-01 09:37:00.000
2014-09-01 10:20:00.000 2014-09-01 10:20:00.000
2014-09-01 10:28:00.000 2014-09-01 10:28:00.000
2014-09-05 08:18:00.000 2014-09-01 08:18:00.000
2014-09-05 08:30:00.000 2014-09-01 08:30:00.000
2014-09-05 08:46:00.000 2014-09-01 08:46:00.000
2014-09-05 09:01:00.000 2014-09-01 09:01:00.000
2014-09-05 09:28:00.000 2014-09-01 09:28:00.000

(8 行受影响)


27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧