2

次の構造の SQL テーブルがあります。

CREATE TABLE dataLog (
tstamp datetime NOT NULL, 
identifier smallint NOT NULL, 
payload binary(46) NOT NULL, 
PRIMARY KEY (tstamp, identifier));

このテーブルでは、ロギング インフラストラクチャが多くのデバイスのデータをログに記録します。デバイス識別子の範囲は、次のとおりです。1 から 125 まで。つまり、列「識別子」には 1 から 125 の値があります。ペイロード列には、各デバイスからのバイナリ データ (ログ情報、温度など) が保持されます。tstamp 列には、現在の時刻情報が保持されます。

特定の時点での各デバイスの「スナップショット」情報を取得するクエリを作成するにはどうすればよいですか。たとえば、たとえば、各識別子(125)のペイロード列の値が何であるかを知りたいです。2012-06-12 12:00:00。テーブル内のデータは、デバイスが送信したときに書き込まれたものです。そのため、データは上記の正確なタイムスタンプではありませんが、たとえば. 2012-06-12 11:59:59 に 2 台のデバイスがデータを送信し、2012-06-12 11:15:30 に 10 台のデバイスがデータを送信したなどです。データは時間をさかのぼって検出する必要があります。

期待される結果: 各識別子、各測定のタイムスタンプ、および各識別子のペイロード値を含む 125 行。

データは、たとえば描画するために必要です。特定のタイムスタンプでの 1 から 125 までのすべてのデバイスの温度のプロット。5分のステップ。

4

1 に答える 1

0

「スナップショット」とは、時間前の各識別子の最新のレコードを意味すると思います。ランキング関数を使用する方法は次のとおりです。

select dl.*
from (select dl.*,
             row_number() over (partition by identifier order by tstamp desc) as seqnum
      from DataLog dl
      where tstamp <= @YOURTIMESTAMPHERE
     ) dl
where seqnum = 1
于 2012-10-16T17:50:32.197 に答える