Sql 将重复数据从最后一行更新到第一行
表名:客户Sql 将重复数据从最后一行更新到第一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,表名:客户 | CID | First | Last | RandomNumber | | 1 | J | T | 432 | | 2 | J | T | 432 | | 3 | J | T | 432 | | 4 | J | T | 100 | | 5 | S | A | 432 | | 6 | S |
| CID | First | Last | RandomNumber |
| 1 | J | T | 432 |
| 2 | J | T | 432 |
| 3 | J | T | 432 |
| 4 | J | T | 100 |
| 5 | S | A | 432 |
| 6 | S | A | 432 |
| 7 | S | A | 200 |
我有一个大约500行的表,我想用最后一个重复行中的数据更新第一个重复行。最后,第一行的随机数应该是100。我希望能够对表中的任何副本执行此操作
谢谢。像这样的东西就可以了。我想你所说的复制品是指第一个、最后一个的组合。首先创建一个cte,对副本中的每一行进行排序,以便知道哪一行是第一行,哪一行是最后一行。然后使用cte将第一行连接到最后一行并进行更新 我会测试这个只是为了确定。我是根据你的样本数据做的,效果很好
;with cte AS
(
SELECT
*
, ROW_NUMBER() OVER (PARTITION BY FIRST, LAST ORDER BY CID) AS Rnk
FROM Customers
)
-- This will show you what will be updated
SELECT cte1.cid, cte1.first, cte1.last, cte1.RandomNumber, cte2.RandomNumber
FROM cte cte1
JOIN (SELECT first, last, max(rnk) as MaxRnk FROM cte GROUP BY first, last) a
ON a.first = cte1.first and a.last = cte1.last and cte1.rnk = 1
JOIN cte cte2 on cte1.first = cte2.first and cte1.last = cte2.last and cte2.rnk = a.maxrnk
-- The update
UPDATE cte1
SET cte1.RandomNumber = cte2.RandomNumber
FROM cte cte1
JOIN (SELECT first, last, max(rnk) as MaxRnk FROM cte GROUP BY first, last) a
ON a.first = cte1.first and a.last = cte1.last and cte1.rnk = 1
JOIN cte cte2 on cte1.first = cte2.first and cte1.last = cte2.last and cte2.rnk = a.maxrnk
像这样的东西应该可以。我想你所说的复制品是指第一个、最后一个的组合。首先创建一个cte,对副本中的每一行进行排序,以便知道哪一行是第一行,哪一行是最后一行。然后使用cte将第一行连接到最后一行并进行更新 我会测试这个只是为了确定。我是根据你的样本数据做的,效果很好
;with cte AS
(
SELECT
*
, ROW_NUMBER() OVER (PARTITION BY FIRST, LAST ORDER BY CID) AS Rnk
FROM Customers
)
-- This will show you what will be updated
SELECT cte1.cid, cte1.first, cte1.last, cte1.RandomNumber, cte2.RandomNumber
FROM cte cte1
JOIN (SELECT first, last, max(rnk) as MaxRnk FROM cte GROUP BY first, last) a
ON a.first = cte1.first and a.last = cte1.last and cte1.rnk = 1
JOIN cte cte2 on cte1.first = cte2.first and cte1.last = cte2.last and cte2.rnk = a.maxrnk
-- The update
UPDATE cte1
SET cte1.RandomNumber = cte2.RandomNumber
FROM cte cte1
JOIN (SELECT first, last, max(rnk) as MaxRnk FROM cte GROUP BY first, last) a
ON a.first = cte1.first and a.last = cte1.last and cte1.rnk = 1
JOIN cte cte2 on cte1.first = cte2.first and cte1.last = cte2.last and cte2.rnk = a.maxrnk
在SQL Server 2012+中,可以使用
第一个值()
在SQL Server 2012+中,可以使用第一个值()
到目前为止你试过什么?你有一些几乎或部分有效的东西吗?你能给出预期的结果吗?到目前为止你都做了些什么?你有一些几乎或部分工作的东西吗?你能给出预期的输出吗
with toupdate as (
select c.*, clast.randomnumber as last_randomnumber
from customer c outer apply
(select top 1 c2.*
from customer c2
where c2.first = c.first and c2.last = c.last
order by id desc
) clast
)
update toupdate
set randomnumber = last_randomnumber
where randomnumber <> last_randomnumber;