繁体   English   中英

SQL Server查询,获取在1字段中具有不同值并在其他字段中具有最大值的记录

[英]SQL Server query, get records with distinct value in 1 field and max in other field

我有一个带有一些列的表:

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  |

其中一些行是重复的(出于我未知的原因,这是管理系统的后端)。 而且value列是一个字符串,它需要转换为数字。

该数据库是只读的,我想根据一些条件将数据提取到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每台机器和(感兴趣的)每个参数的记录。 首先我尝试

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不在数据集中的val ,正确的机器/参数/输入日期,但是错误的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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM