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;