这是一个MS-SQL
有许多行重复数据,其中一些获得最新更新,有些则没有。 我想用那些获取最新信息来更新那些旧数据。
from:
orderNum itemID orderTime desc
7247168 101 2013-08-11 09:51:39.20 desc_101_cc
102594 101 2012-09-26 21:17:50.44 desc_101_aaa
631595 101 2014-03-11 19:51:29.40 desc_101_ddd
1157428 235 2014-03-01 10:16:42.43 desc_235_8
7212306 235 2014-03-14 11:26:51.29 desc_235_2
100611 235 2014-03-21 20:23:43.03 desc_235_2
要:
orderNum itemID orderTime desc
7247168 101 2013-08-11 09:51:39.20 desc_101_ddd
102594 101 2012-09-26 21:17:50.44 desc_101_ddd
631595 101 2014-03-11 19:51:29.40 desc_101_ddd
1157428 235 2014-03-01 10:16:42.43 desc_235_2
7212306 235 2014-03-14 11:26:51.29 desc_235_2
100611 235 2014-03-21 20:23:43.03 desc_235_2
我想使用max(orderTime)
获取最新版本的desc
然后用它来更新其他desc
这意味着我想使用orderTime
来判断哪个desc
是最新的
然后更新其他desc
需要更新的唯一列是desc
请帮我解决这个SQL
答案 0 :(得分:1)
这样的东西(在SQL Server 2000或更早版本中不起作用)?不要在生产表上尝试这个;制作临时复制表进行试用。
;WITH MaxT AS (
SELECT
itemID
,maxOrderTime = MAX(orderTime)
FROM
myTable
),
MaxTDesc AS (
SELECT
itemID
,desc
FROM
myTable MaxTDesc
,MaxT
WHERE
MaxTDesc.ItemID = MaxT.ItemID
AND MaxTDesc.orderTime = MaxT.maxOrderTime
)
UPDATE
mt
SET
mt.desc = MaxTDesc.desc
FROM
myTable mt, MaxT
WHERE
mt.itemID = MaxTDesc.itemID
答案 1 :(得分:1)
如果您使用的是SQL Server 2012,则可以使用last_value
:
with toupdate as (
select t.*,
last_value("desc") over (partition by itemID order by orderTime) as lastdesc
from table t
)
update toupdate
set "desc" = lastdesc;
如果您不使用SQL Server 2012,则可以使用相关子查询来模拟它:
with toupdate as (
select t.*,
(select top 1 "desc"
from table t2
where t2.itemId = t.itemId
order by orderTime desc
) as lastdesc
from table t
)
update toupdate
set "desc" = lastdesc;
答案 2 :(得分:0)
试试这个...我正在使用ROW_NUMBER()
选择最新的更新记录,然后为其他人设置desc列
WITH CTE
AS (
SELECT *
, ROW_NUMBER() OVER (partition by itemid ORDER BY ordertime desc) ROWNUM
FROM Your_table_name
)
UPDATE A
SET desc = CTE.desc
FROM Your_table_name A
INNER JOIN CTE ON A.itemid = CTE.itemid
WHERE CTE.ROWNUM=1