私はsql-expertではありませんが、この問題に遭遇しました:
MicrosoftSQL2008サーバーからデータを取得する必要があります。記録間隔のない、さまざまなプローブからのさまざまな測定データを保持します。つまり、一部のプローブはデータベース内のデータを週に1回、別のプローブは1秒に1回転送できます。プローブはID(一意ではない)によって識別され、ポイントは各ID(プローブ)から最後のレコードのみを取得することです。テーブルは次のようになります(最後の5、SampleDateTimeの説明による順序):
TagID SampleDateTime SampleValue QualityID
13 634720670797944946 112 192
23 634720670797944946 38.1 192
17 634720670797944946 107.5 192
14 634720670748012090 110.6 192
19 634720670748012090 99.7 192
サーバーや設定を変更することはできません。クエリを実行することのみが許可されています。そして、要求されたデータを等間隔で(たとえば、1分に1回程度)取得する必要があります。100を超えるプローブ(異なるIDを持つ)があり、そのうち約40を読み取る必要があります。したがって、これを単一のクエリで実行できる場合は、各行を個別のクエリで取得するよりもはるかに効率的である可能性があると思います。
MySQLと同様のテーブルを使用すると、この方法で望ましい結果が得られました(より良い方法の提案が高く評価されています!):
SELECT TagID,SampleDateTime,SampleValue FROM
(
SELECT TagID,SampleDateTime,SampleValue FROM measurements
WHERE TagID IN(101,102,103) ORDER BY SampleDateTime DESC
)
AS table1 GROUP BY TagID;
正しいデータでも、それでうまくいくと思いました(MAX()やDISTINCTで管理できなかった、または何を試しても)。ただし、「GROUP BY」が原因で、MsSQLでは当然機能しません。
Column 'table1.SampleValue' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
私はこれに非常に固執しているので、どんな洞察も大歓迎です。