问题描述
首先,让我先说我在 sql 方面很糟糕,所以我很抱歉。
这是我需要实现的目标。
时间戳 | value1 | value2 | value3 |
---|---|---|---|
2021-04-14T100:00:01.000Z | 1 | 1 | 1 |
2021-04-14T100:00:02.000Z | 1 | 1 | 1 |
2021-04-14T100:00:03.000Z | 1 | 1 | 1 |
2021-04-14T100:00:04.000Z | 1 | 1 | 1 |
2021-04-14T100:00:05.000Z | 1 | 1 | 0 |
2021-04-14T100:00:06.000Z | 1 | 1 | 1 |
我正在处理一些 IOT 数据,这些数据大约以 1 秒的间隔输入。它不会总是精确到 1 秒。
我想从当前时间戳中提取所有记录并说 2 秒前。所以,在这种情况下,为了争论起见,让我们从 2021-04-14:00:00:04 开始。
查询应该提取出前 3 个查询,其中值都大于 0。它看起来像:
Select * from table
WHERE DateAdd(seconds,-3,"2021-04-14T00:00:03) AND
value 1 > 0 AND value2 > 0 AND value3 > 0
这很好,将返回前三行。我要挂断的是,我想要一种方法来确定返回的所有行是否符合条件。
因此,如果从 06 开始附加相同的查询:
Select * from table
WHERE DateAdd(seconds,"2021-04-14T00:00:06) AND
value 1 > 0 AND value2 > 0 AND value3 > 0
它只会返回 2 行而不是 3 行。除了执行另一个有效相反的查询然后比较计数之外,我不知道如何确定中间有没有包含的行。
我想我只是在寻找一种更聪明的方法来做到这一点。
非常感谢任何和所有建议。
解决方法
不确定我是否完全理解你,但你可以使用 ORDER BY 和 TOP
SELECT TOP 3 t.* FROM (
Select s.* from table s
WHERE s.timestamp < <<YourTargetDateHere>>
AND s.value1 > 0 AND s.value2 > 0 AND s.value3 > 0
ORDER BY s.timestamp DESC) t
这将首先仅过滤符合所有条件的记录,然后根据日期列的降序选择前 3 条记录。