SQL通过一个最新日期行更新其他行

时间:2014-03-25 18:22:31

标签: sql sql-server

这是一个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

3 个答案:

答案 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