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

表中某一列有相同数据,如何只更新此相同数据的第一条记录?
有表 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语句,求大神。。。
------解决思路----------------------
怎么又是一个开创函数的问题?今天这是怎么了?

另外,你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



------解决思路----------------------
引用:
Quote: 引用:

怎么又是一个开创函数的问题?今天这是怎么了?

另外,你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


SELECT C1, C1 * 3 AS C3 FROM TableA group by C1