简单的SQL更新查询无法弄清楚

时间:2014-02-06 13:55:05

标签: sql sql-server max

表1:

client     report_date     date_of_analysis
554        30.12.2013      15.01.2014
554        30.12.2013      25.01.2014
554        30.12.2012      15.01.2013
554        30.12.2012      28.01.2013
554        30.12.2011      15.01.2012
556        30.12.2013      15.01.2014
556        30.12.2012      15.01.2013
556        30.12.2011      15.01.2012
556        30.12.2011      05.01.2012

当有两份报告并且分析日期较旧时,我想用前面的x更新客户编号。

在这种情况下,它应该用分析日期15.01.2014更新一个客户端554。报告日期为2013年12月30日。现在应该是'x554'。

我试过了:

update table1 
set client= 'x'+client
where date_of_analysis<max(date_of_analysis)

但这不起作用

结果将是:

client     report_date     date_of_analysis
X554       30.12.2013      15.01.2014
554        30.12.2013      25.01.2014
X554       30.12.2012      15.01.2013
554        30.12.2012      28.01.2013
554        30.12.2011      15.01.2012
556        30.12.2013      15.01.2014
556        30.12.2012      15.01.2013
556        30.12.2011      15.01.2012
X556       30.12.2011      05.01.2012

2 个答案:

答案 0 :(得分:5)

假设date_of_analysis是日期时间或日期

;with x as
(
select client, date_of_analysis, 
  row_number() over (partition by client, report_date 
    order by date_of_analysis desc) rn
from <table>
where client not like 'x%'
)
update x
set client = 'x' + client
where rn > 1

答案 1 :(得分:4)

最简单的解决方案是:

update  t1
set client= 'x'+client
FROM table1 t1
where EXISTS 
   (SELECT 1
    FROM Table1
    WHERE Client = t1.Client
    AND date_of_analysis > t1.date_of_analysis
    AND report_date = t1.report_date)
AND LEFT(Client, 1) <> 'x'

这将在同一客户端有更新记录的行上的任何客户端名称中添加X.