フィールドにいくつかのデバイスがあり、時々接続が失われて 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