SQL Server查询,在1字段中获取不同值的logging,在其他字段中获取最大值

我有一个列有一些列:

WON param | machine | inputdate | val ---|-------------|------------|------------------|--------| 18 | PAR.SPTDM.X1| MM01 | 20/01/2013 12:43 | 2.5 | 18 | PAR.SPTDM.Y1| MM01 | 20/01/2013 12:43 | 3,4 | 22 | PAR.SPTDM.X1| MM01 | 22/01/2013 16:10 | 1.2 | 22 | PAR.SPTDM.Y1| MM01 | 22/01/2013 16:10 | 1.7 | 33 | PAR.SPTDM.X1| MM03 | 22/01/2013 16:13 | 2.34 | 33 | PAR.SPTDM.Y1| MM03 | 22/01/2013 16:13 | 2,21 | 27 | PAR.LAS.PWR | MM10 | 25/01/2013 08:14 | 100.5 | 14 | PAR.LAS.UV | MM10 | 18/01/2013 17:27 | 134.8 | 41 | PAR.LAS.UV | SLA4 | 27/01/2013 09:14 | 2,1 | 62 | PAR.LAS.UV | SLA5 | 27/01/2013 11:15 | 14.6 | 

其中一些行被复制(出于我未知的原因,这是pipe理系统的后端)。 value列也是一个string,它需要转换为数字。

数据库是只读的,我想根据几个条件将数据导入到Excel表单中:

  • machineparam分组
  • 过滤param :只有'PAR.SPTDM.%'
  • machine过滤:只有'MM%'
  • 用逗号忽略val,将其余的转换为数字

这工作没有任何问题使用以下查询:

 SELECT DISTINCT t1.param, t1.machine, cast(t1.val as float), t1.inputdate FROM dbbackend t1 WHERE (t1.machine Like 'MM%') AND (t1.param Like 'PAR.SPTDM.%') AND (t1.val<>'') And (t1.val not Like '%,%') 

现在我只想用最新的inputdate检索每台机器和每个参数(感兴趣的)的inputdate 。 首先我尝试了

 SELECT DISTINCT t1.param, t1.machine, max(cast(t1.val as float)), max(t1.inputdate) FROM dbbackend t1 WHERE (t1.machine Like 'MM%') AND (t1.param Like 'PAR.SPTDM.%') AND (t1.val<>'') And (t1.val not Like '%,%') GROUP BY machine, param 

但是,这给了我val不是在数据集中,正确的机器/参数/inputdate,但错误的VAL。

接下来的尝试是

 SELECT DISTINCT t1.param, t1.machine, cast(t1.val as float), t1.inputdate FROM dbbackend t1 WHERE t1.WON IN ( SELECT latestrec.WON FROM ( SELECT DISTINCT max(t2.WON), t2.param, t2.machine, max(t2.inputdate) FROM dbbackend t2 WHERE (t2.machine Like 'MM%') AND (t2.param Like 'PAR.SPTDM.%') AND (t2.val<>'') And (t2.val not Like '%,%') GROUP BY machine, param ) as latestrec ) 

但MS Query告诉我,这是行不通的

无法添加表'(')。

那么有人可以告诉我为什么我第一次打电话的时候会得到错误的价值,为什么第二次不工作,或者什么是正确的方法? 我也怀疑MS查询超过该嵌套的子查询:/

你可以用ROW_NUMBER函数试试这个CTE

 WITH x AS (SELECT t1.param, t1.machine, Cast(t1.val AS FLOAT) AS val, t1.inputdate, RN=Row_number() OVER( partition BY t1.machine, t1.param ORDER BY t1.inputdate DESC) FROM dbbackend t1 WHERE ( t1.machine LIKE 'MM%' ) AND ( t1.param LIKE 'PAR.SPTDM.%' ) AND ( t1.val <> '' ) AND ( t1.val NOT LIKE '%,%' )) SELECT param, machine, val, inputdate FROM x WHERE rn = 1