查看选择中的所有行是否符合条件

问题描述

首先,让我先说我在 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 条记录。