表中某一列有相同数据,如何只更新此相同数据的第一条记录?

皮特胖胖 2015-09-17 10:52:03
有表 TableA 中有列 C1 和 C2 ,列 C1 中有很多相同的数据,怎样只更新相同数据的第一条记录?
示例如下:
C1 C2
-----------
1 NULL
1 NULL
2 NULL
2 NULL
3 NULL
3 NULL

只更新每个C1相同数据的第一个
C1 C2
-----------
1 0
1 NULL
2 0
2 NULL
3 0
3 NULL

最好只使用一条Update语句,求大神。。。
...全文
154 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
皮特胖胖 2015-09-18
  • 打赏
  • 举报
回复
引用 1 楼 x_wy46 的回复:
怎么又是一个开创函数的问题?今天这是怎么了? 另外,你c2列都是null,哪个c2算c1相同行的是第一行呢?



create table #t
(
	c1 int,
	c2 varchar(10)
)

insert into #t values (1,null)
insert into #t values (1,null)
insert into #t values (1,null)

insert into #t values (2,null)
insert into #t values (2,null)
insert into #t values (2,null)


;with cte as
(
	select ROW_NUMBER()over(partition by c1 order by c2) as rn ,* from #t
)
update cte set c2=0 where rn=1

select * from #t

1	0
1	NULL
1	NULL
2	0
2	NULL
2	NULL

你好,刚刚才接触到开窗函数,再次请教一下,如何使用开窗函数SELECT出这样的情况:

-- 普通方法,每一行都要进行运算
SELECT C1, C1 * 3 AS C3 FROM TableA
因为实际情况运算没这么简单了,所以请问能否在C1列相同的情况下只执行一次运算生成C3列?

-- 错误的方法
SELECT C1, C1 * 3 OVER(PARTITION BY C1) AS C3 FROM TableA
qq_17482963 2015-09-18
  • 打赏
  • 举报
回复
引用 2 楼 hironpan 的回复:
[quote=引用 1 楼 x_wy46 的回复:] 怎么又是一个开创函数的问题?今天这是怎么了? 另外,你c2列都是null,哪个c2算c1相同行的是第一行呢?



create table #t
(
	c1 int,
	c2 varchar(10)
)

insert into #t values (1,null)
insert into #t values (1,null)
insert into #t values (1,null)

insert into #t values (2,null)
insert into #t values (2,null)
insert into #t values (2,null)


;with cte as
(
	select ROW_NUMBER()over(partition by c1 order by c2) as rn ,* from #t
)
update cte set c2=0 where rn=1

select * from #t

1	0
1	NULL
1	NULL
2	0
2	NULL
2	NULL

你好,刚刚才接触到开窗函数,再次请教一下,如何使用开窗函数SELECT出这样的情况:

-- 普通方法,每一行都要进行运算
SELECT C1, C1 * 3 AS C3 FROM TableA
因为实际情况运算没这么简单了,所以请问能否在C1列相同的情况下只执行一次运算生成C3列?

-- 错误的方法
SELECT C1, C1 * 3 OVER(PARTITION BY C1) AS C3 FROM TableA
[/quote]
SELECT C1, C1 * 3 AS C3 FROM TableA group by C1
专注or全面 2015-09-17
  • 打赏
  • 举报
回复
怎么又是一个开创函数的问题?今天这是怎么了? 另外,你c2列都是null,哪个c2算c1相同行的是第一行呢?



create table #t
(
	c1 int,
	c2 varchar(10)
)

insert into #t values (1,null)
insert into #t values (1,null)
insert into #t values (1,null)

insert into #t values (2,null)
insert into #t values (2,null)
insert into #t values (2,null)


;with cte as
(
	select ROW_NUMBER()over(partition by c1 order by c2) as rn ,* from #t
)
update cte set c2=0 where rn=1

select * from #t

1	0
1	NULL
1	NULL
2	0
2	NULL
2	NULL

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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