1

我们使用的是 SQL Server 2008,表的一个示例。我正在尝试清理(然后将在以后删除重复项)prev_date列在item#相同时不同的地方。我想用max(prev_date)值更新两条记录。我很难弄清楚如何使用单个语句对多个记录执行此操作

key                     item(int)             prev_date(int)
--------------------------------------------------------------------
15086                           1163            20121023
16289                           1163            20130121
15087                           1164            20121024
16290                           1164            20130120
15088                           1165            20121029
16291                           1165            20130120
4

3 回答 3

2
update a set a.date=b.date from table_1 as a 
inner join 
(select *,row_number() over(partition by item order by date desc)as rownum from table_1  
)b 
on a.item=b.item and b.rownum=1
于 2013-09-12T16:13:27.803 回答
1

CTE 提供干净的 SQL

;with cte_max(item, maxdate) as (
 select item, max(prev_date) from t
 group by item
)
update t
    set prev_date = m.maxdate
  from t
    inner join cte_max m on t.item = m.item 
 where t.prev_date <> m.maxdate
于 2013-09-12T15:56:26.577 回答
0

对于这些类型的更新,我喜欢使用可更新的 CTE:

with toupdate (
      select t.*, max(prev_date) over (partition by item) as new_prev_date
      from t
     )
update toupdate
    set prev_date = new_prev_date
    where prev_date <> new_prev_date;  -- optional `where` clause

还有其他方法。标准 SQL 将是:

update t
    set prev_date = (select max(prev_date) from t t2 where t2.item = t.item);
于 2013-09-12T15:52:01.380 回答