【问题标题】:Detecting when ConditionB occurs after ConditionA in SQL在 SQL 中的 Condition 之后检测 Condition 何时发生
【发布时间】:2017-11-26 15:16:11
【问题描述】:

我有一个编码问题,希望这里的一些更有经验的人可以帮助我。

我希望创建以下结果。它基于分钟数据。我有一列“ConditionA”和“ConditionB”。我正在尝试检测“ConditionA”之后出现“ConditionB”的时间。我需要在每天结束时重置它。

DATETIME                    ConditionA      ConditionB      Detected

2017-10-31 15:55:00.000         0               0               0
2017-10-31 15:56:00.000         1               0               0
2017-10-31 15:57:00.000         1               0               0
2017-10-31 15:58:00.000         1               0               0
2017-10-31 15:59:00.000         0               0               0
2017-10-31 16:00:00.000         0               1               1
2017-10-31 16:01:00.000         0               1               0
2017-10-31 16:02:00.000         0               1               0
2017-10-31 16:03:00.000         0               0               0
2017-10-31 16:04:00.000         1               0               0
2017-10-31 16:05:00.000         1               0               0
2017-10-31 16:06:00.000         0               0               0
2017-10-31 16:07:00.000         0               0               0
2017-10-31 16:08:00.000         0               1               1
2017-10-31 16:09:00.000         0               1               0
2017-10-31 16:10:00.000         0               1               0
2017-10-31 16:11:00.000         0               0               0
2017-10-31 16:12:00.000         0               1               0
2017-10-31 16:13:00.000         0               1               0
2017-10-31 16:14:00.000         0               1               0
2017-10-31 16:15:00.000         0               0               0
2017-10-31 16:16:00.000         0               1               0
2017-10-31 16:17:00.000         0               0               0
2017-10-31 16:18:00.000         0               0               0
2017-10-31 16:19:00.000         1               0               0
2017-10-31 16:20:00.000         1               0               0
2017-10-31 16:21:00.000         1               0               0
2017-10-31 16:22:00.000         0               0               0
2017-10-31 16:23:00.000         0               0               0
2017-10-31 16:24:00.000         1               0               0
2017-10-31 16:25:00.000         0               1               1
2017-10-31 16:26:00.000         0               1               0

我已经为此工作了一周,并且一直在转动我的车轮。我已经考虑过 CTE 和 While 循环,但一直无法解决这个问题。有人会介意我指出正确的方向,什么方法最终会奏效吗?如果我知道这一点,我可以试一试,如果需要,可以提出更多问题。

谢谢你,

【问题讨论】:

  • 你能告诉我们你到目前为止所做的尝试吗?
  • 提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

标签: sql tsql sql-server-2016


【解决方案1】:

您似乎只想查看B1 的位置,而前面的值不是0。如果是这样:

select t.*,
       (case when b = 1 and lag(b) over (order by datetime) = 0
             then 1 else 0
        end) as detected
from t;

【讨论】:

  • Gordon 是的,谢谢,您的解决方案是我目标的一部分。为了被“检测到”,条件 B 必须仅在条件 A 发生后才出现。我已经编辑了我的原始帖子并创建了一个新表,其中包含额外的行来说明我的意思。
【解决方案2】:

谢谢 Gordon,您的回答让我找到了解决方案。应该是这样的:

select t.*,
   (case when b = 1 and lag(b) over (order by datetime) = 0
         then 1 else 0
    end) as detected
from t
where not (a = 0 AND b = 0);

通过 where 子句删除两个条件都为零的行允许它按需要工作。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多