私はいくつかの列を持つテーブルを持っています:
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%'
- コンマで 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
、データセットにない、正しい machine/param/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 は私に言った
テーブル '(' を追加できませんでした。
では、最初の呼び出しで間違った値が得られる理由、2 番目の呼び出しが機能しない理由、または正しい方法は何か教えてもらえますか? また、MS クエリがそのネストされたサブクエリをトリップするのではないかと疑っています:/