【发布时间】:2019-09-07 23:22:06
【问题描述】:
我在现场有一些设备,通过 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(第二列)是来自设备的时间戳,区别显然是发送过程的延迟。
从我设备的每个传感器中,我得到一个单独的条目,因此我只需要计算行数即可了解在特定时间范围内设备上存储了多少数据点(这会有所不同,具体取决于设备)。
现在我喜欢按时间戳分组来评估每个时间戳,已经创建了多少数据集,但到目前为止还没有到达服务器。
因此,对于每个时间戳,我想知道数据集中的行数,这些行在未来有一个时间戳,但在过去有一个 lastchanged。
由于我的数据集非常大,我想避免任何获取。
是的,这不应该是实时分析,我只需要它来了解设备的行为并调整一些参数。
我已经试过了:
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
并认为 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
【问题讨论】:
-
首先,您的
FROM子句会导致笛卡尔积,这通常很糟糕。你想通过两次使用@table来完成什么? -
是的,你是对的,但我认为,我需要类似 self-Join 的东西:对于 AI 中的每个(分组)时间戳都想计算 B 中具有较年轻 lastchanged 的 thouse 行(因为该条目已经创建)但不是更年轻的时间戳(因为数据正在等待,仍在发送到服务器的途中,时间戳应该比当前更早)。因此,不知何故,我需要将时间戳中的每个单个条目与所有其他 lastchanged 和时间戳条目进行比较。我想这只能通过笛卡尔积来实现。但我可能完全错了。
-
请正确标记您的问题。
SQL只是多个 dbms 供应商使用的一种语言。
标签: sql azure join time-series sql-data-warehouse