![](/img/trans.png)
[英]SQL Server : SELECT query to get DISTINCT and MAX display order value
[英]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工作表中:
machine
和param
分组 param
:仅'PAR.SPTDM.%'
machine
过滤器:仅'MM%'
使用以下查询,可以正常工作:
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.