简单的SQL更新查询无法理解

简单的SQL更新查询无法理解,sql,sql-server,max,Sql,Sql Server,Max,表1: 当有两份报告且分析日期较旧时,我想用前面的x更新客户编号 在这种情况下,应使用分析日期2014年1月15日更新一个客户554。报告日期为2013年12月30日。现在应该是'x554' 我试过: 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

表1:

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

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

我试过:

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

假设分析的日期是日期时间或日期

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

最简单的解决方案是:

;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

这将在同一客户机有较新记录的行上的任何客户机名称上添加一个X。

客户机的数据类型是什么?什么是不工作?它是否显示任何错误消息?您想用dat_Analysiss实现什么是的,它显示了一条关于where的错误消息statement@user3279834您认为我们是否可以看到错误消息?还是太麻烦了?Msg 147,级别15,状态1,第3行聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且被聚合的列是外部引用--------------------------------------问题在于这种比较日期的方法应该只更新相同日期的报告存在两次或两次以上且分析日期小于该报告的最高分析日期的值如果需要检查日期,我可以在其中添加另一行,否则这就是它所做的。它不会检查报告的日期,因此它会在每个分析日期小于最大日期的客户机上添加xone@user3279834修订版可以,现在试试是的,可以。如果你想澄清你的要求,请这样做,但正如你解释这个问题,这解决了它。
;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
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'