1

フィールドにいくつかのデバイスがあり、時々接続が失われて GSM でデータを送信しています。ディスク容量が限られているため、接続されていない期間に一部のデータが失われる傾向があるため、保留中のデータの量を評価して、状況の洞察を得るのが好きです.

サーバーのテーブルを必要な列に減らすと、次のようになります。

Declare @table  as table( 
timestamp datetime, 
lastchanged datetime )
INSERT INTO @table
VALUES 
('2019-04-01 12:27:23', '2019-04-01 12:26:17'),
('2019-04-01 12:27:23', '2019-04-01 12:25:47'),
('2019-04-01 12:27:23', '2019-04-01 12:26:17'),
('2019-04-01 12:27:23', '2019-04-01 12:26:03'),
('2019-04-01 12:27:23', '2019-04-01 12:26:20'),
('2019-04-01 12:28:23', '2019-04-01 12:25:52'),
('2019-04-01 12:28:23', '2019-04-01 12:26:22'),
('2019-04-01 12:28:23', '2019-04-01 12:26:18'),
('2019-04-01 12:28:23', '2019-04-01 12:25:54'),
('2019-04-01 12:29:23', '2019-04-01 12:25:47'),
('2019-04-01 12:29:23', '2019-04-01 12:26:17'),
('2019-04-01 12:29:23', '2019-04-01 12:25:47'),
('2019-04-01 12:29:23', '2019-04-01 12:25:45'),
('2019-04-01 12:30:23', '2019-04-01 12:26:17'),
('2019-04-01 12:30:23', '2019-04-01 12:25:47'),
('2019-04-01 12:30:23', '2019-04-01 12:26:17'),
('2019-04-01 12:31:23', '2019-04-01 12:26:03'),
('2019-04-01 12:31:23', '2019-04-01 12:26:20'),
('2019-04-01 12:31:23', '2019-04-01 12:25:52'),
('2019-04-01 12:31:23', '2019-04-01 12:26:22'),
('2019-04-01 12:31:23', '2019-04-01 12:26:18'),
('2019-04-01 12:31:23', '2019-04-01 12:25:54'),
('2019-04-01 12:32:23', '2019-04-01 12:25:47'),
('2019-04-01 12:32:23', '2019-04-01 12:26:17'),
('2019-04-01 12:32:23', '2019-04-01 12:25:47'),
('2019-04-01 12:32:23', '2019-04-01 12:25:45');

タイムスタンプ (最初の列) の値はサーバーで作成され、lastchanged (2 番目の列) はデバイスからのタイムスタンプであるため、違いは明らかに送信プロセスによる遅延です。

デバイスのすべてのセンサーから個別のエントリを取得するため、行をカウントして、特定の時間範囲内にデバイスに保存されたデータポイントの数を把握する必要があります (これは、デバイスの動作によって異なります)。 .

ここで、タイムスタンプごとにグループ化して、このタイムスタンプごとに、作成済みでサーバーに到達していないデータセットの数を評価します。

したがって、タイムスタンプごとに、データセット内の行の量を知りたいと思います。これには、将来のタイムスタンプがありますが、過去に変更されたものがあります。

私のデータセットは非常に大きいので、フェッチは避けたいと思います。

はい、これはインタイム分析ではありません。デバイスの動作を理解し、いくつかのパラメーターを調整するために必要なだけです。

私はすでにこれを試しました:

SELECT
    A.timestamp,
    COUNT(case when (A.timestamp < B.timestamp AND A.timestamp > B.lastchanged  ) then 1 else null end) AS CountPending
FROM @table A, @table B
GROUP BY A.timestamp
ORDER BY A.timestamp

また、フィルタリングとカウントを 1 つのステップで行う必要があるため、CTE とサブクエリは役に立たないと考えています。そして、私が理解しているように、SQL で実行されている従来のウィンドウでは、ウィンドウ範囲の一定量のエントリが必要ですが、私のデータセットでは、この数はまったく一定ではありません。

上記の例に適用すると、結果は間違っています。

2019-04-01 12:27:23.000 105
2019-04-01 12:28:23.000 68
2019-04-01 12:29:23.000 52
2019-04-01 12:30:23.000 30
2019-04-01 12:31:23.000 24
2019-04-01 12:32:23.000 0
4

2 に答える 2

0

これは、次のようなサブクエリに変換されます。

SELECT a.troID, a.timestamp, MAX(x.c)
FROM test.SensorData a
    CROSS APPLY
        (
        SELECT COUNT(*) c
        FROM test.SensorData b
        WHERE a.troID = b.troID
          AND a.timestamp < b.timestamp 
          AND a.timestamp > b.lastchanged
        ) x
GROUP BY a.troID, a.timestamp

troIdハッシュ化が役立つと思いますが、データ、分布、ボリュームについてもっと知る必要があります。

于 2019-06-07T18:02:06.290 に答える