【问题标题】:how to write this logic in SQL如何在 SQL 中编写此逻辑
【发布时间】:2019-03-26 17:32:25
【问题描述】:

有一个3列的表,每2分钟生成一条新记录。

ID:按顺序为每条记录生成一个ID(按时间顺序以及日期和时间戳)

时间:日期和时间戳(每 2 分钟运行一次)

标志:0 或 1(1 表示好 0 表示坏)

我想写一个条件来检查标志是 0 还是 1 最后 8 分钟,前 4 分钟,后 4 分钟,后 8 分钟

原表:

MONITORID   CREATEDATETIME    Flag
209263      26/3/2019 16:56     1
209262      26/3/2019 16:54     1
209261      26/3/2019 16:52     1
209260      26/3/2019 16:50     1
209259      26/3/2019 16:48     1
209258      26/3/2019 16:46     1
209257      26/3/2019 16:44     1
209256      26/3/2019 16:42     1
209255      26/3/2019 16:40     1
209254      26/3/2019 16:38     1
209253      26/3/2019 16:36     1
209252      26/3/2019 16:34     1
209251      26/3/2019 16:32     1
209250      26/3/2019 16:30     1
209249      26/3/2019 16:28     1
209248      26/3/2019 16:26     1
209247      26/3/2019 16:24     1
209246      26/3/2019 16:22     1
209245      26/3/2019 16:20     1
209244      26/3/2019 16:18     1

最终结果应如下所示:

MONITORID   CREATEDATETIME    Flag  Flag_+4_-4  Flag_+0_-8
209263      26/3/2019 16:56     1       3           5
209262      26/3/2019 16:54     1       4           5
209261      26/3/2019 16:52     1       5           5
209260      26/3/2019 16:50     1       5           5
209259      26/3/2019 16:48     1       5           5
209258      26/3/2019 16:46     1       5           5
209257      26/3/2019 16:44     1       5           5
209256      26/3/2019 16:42     1       5           5
209255      26/3/2019 16:40     1       5           5
209254      26/3/2019 16:38     1       5           5
209253      26/3/2019 16:36     1       5           5
209252      26/3/2019 16:34     1       5           5
209251      26/3/2019 16:32     1       5           5
209250      26/3/2019 16:30     1       5           5
209249      26/3/2019 16:28     1       5           5
209248      26/3/2019 16:26     1       5           5
209247      26/3/2019 16:24     1       5           4
209246      26/3/2019 16:22     1       5           3
209245      26/3/2019 16:20     1       4           2
209244      26/3/2019 16:18     1       3           1

我们想出这个逻辑的原因是看过去 8 分钟是否一切正常。然后将其汇总为每日级别,以显示一整天是否良好。

非常感谢任何帮助!

【问题讨论】:

  • 到目前为止,您自己尝试过什么来解决这个问题?你能分享你的尝试吗?时间戳总是每 2 分钟一次吗?
  • 我无法实现这个逻辑,是的,它每2分钟记录一次。
  • 我们很高兴您在这里,我们希望帮助您修复代码,而不是为您编写代码。
  • 你的尝试没有成功很好@Toros91,但向我们展示你所做的尝试仍然很重要。可能是您的尝试非常接近目标。例如,您是否考虑过使用LAGROWS BETWEEN呢?

标签: sql sql-server


【解决方案1】:

这就是你所追求的。这使用条件聚合,并且ROWS BETWEEN 子句计算Flag 在定义的“范围”中具有值1 的次数。但是,这要求行的间隔为 2 分钟。如果不是,这将不会按您的预期工作:

WITH VTE AS(
    SELECT V.MONITORID,
           CONVERT(smalldatetime,V.CREATEDATETIME,103) AS CREATEDATETIME,
           Flag
    FROM (VALUES (209263,'26/3/2019 16:56',1),
                 (209262,'26/3/2019 16:54',1),
                 (209261,'26/3/2019 16:52',1),
                 (209260,'26/3/2019 16:50',1),
                 (209259,'26/3/2019 16:48',1),
                 (209258,'26/3/2019 16:46',1),
                 (209257,'26/3/2019 16:44',1),
                 (209256,'26/3/2019 16:42',1),
                 (209255,'26/3/2019 16:40',1),
                 (209254,'26/3/2019 16:38',1),
                 (209253,'26/3/2019 16:36',1),
                 (209252,'26/3/2019 16:34',1),
                 (209251,'26/3/2019 16:32',1),
                 (209250,'26/3/2019 16:30',1),
                 (209249,'26/3/2019 16:28',1),
                 (209248,'26/3/2019 16:26',1),
                 (209247,'26/3/2019 16:24',1),
                 (209246,'26/3/2019 16:22',1),
                 (209245,'26/3/2019 16:20',1),
                 (209244,'26/3/2019 16:18',1)) V(MONITORID, CREATEDATETIME, Flag))
SELECT V.MONITORID,
       V.CREATEDATETIME,
       V.Flag,
       COUNT(CASE V.Flag WHEN 1 THEN 1 END) OVER (ORDER BY V.CREATEDATETIME
                                                  ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS [Flag-4+4],
       COUNT(CASE V.Flag WHEN 1 THEN 1 END) OVER (ORDER BY V.CREATEDATETIME
                                                  ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS [Flag-8+0]
FROM VTE V
ORDER BY V.CREATEDATETIME DESC;

【讨论】:

  • 工作就像一个魅力,真的很抱歉提出这样愚蠢的问题。我真的浪费了一整天,因为我不知道要搜索的确切关键字。太感谢了!我非常感谢您的及时回复!干杯!
  • @Toros91 不知道ROWS BETWEEN 语法没什么错。自 2012 年推出以来,很多人似乎都错过了它。然而,它是一个非常有用的工具。 (就我个人而言,我认为 2012 中添加了很多窗口/聚合函数。)但是,如果这确实解决了问题,请将其标记为解决方案,以便未来的读者知道它很有帮助。谢谢。
  • 当然,我也会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多