【问题标题】:SQL sum elapsed duration between rows for values outside limit bound for each rowSQL sum elapsed duration between rows for values outside limit bound for each row
【发布时间】:2017-12-21 16:24:25
【问题描述】:

有点 SQL 爱好者,所以坚持使用 VantagePoint 的 SQL CLR 后处理插件将简单的 C++/Python/Excel 函数转换为 SQL 查询。想做类似这个 excel 功能的事情,所以我只有时间戳和值。如果读数的值小于下限,则希望计算读数之间的总经过时间,然后添加到该运行总和,对于高于下限的读数的运行总和也是如此。

https://image.ibb.co/dJr0kR/SQLTime_Diff.png

这将是普通的伪代码,但不确定如何使用 CLR 将其转换为 SQL

foreach(row)
    if(value < lowLimit)
        lowSum += (time[row] - time[row - 1])
    if(value > highLimit)
        highSum +=(time[row] - time[row - 1])

然后我可以添加到报告中,我正在为每个总和建立最终值。目的是在超出限制的经过时间大于给定的可接受范围时进行可视化/警报

【问题讨论】:

  • 什么版本的 SQL?你能告诉我们所涉及的表格的结构吗?示例数据也会有所帮助。
  • 哪个dbms???? SQL 只是多个 dbms 供应商使用的一种语言。它们每个都有自己的语法。
  • MMSQL 2012。最终将使用 PH 值,但现在使用有利位置提供的示例数据这是我可以提取的历史数据image.ibb.co/c5NyN6/so1.png 所以我最终只需要在限制 y 下 x 秒超过限制的秒数 这是提供的 Rockwell Vantage Point 存储过程 image.ibb.co/e6Nhh6/so2.png
  • 以及 sum_in_state 擅长什么image.ibb.co/fyJNh6/so5.png
  • 问题仍然是我无法在 sql 中复制 #timeseries。我已经尝试将其修剪为此,但无法从历史表中获取 rowID 我可以生成image.ibb.co/cREpUm/so6.png 这是我可以从历史数据中提取的完整可用数据,我需要的只是时间戳和 valueasfloat,将当我得到实际数据时有类似的数据image.ibb.co/fXChh6/so7.png

标签: sql sql-server tsql datediff


【解决方案1】:

给定下表:

CREATE TABLE TableA (RowDate DATETIME, val INT)

您可以使用LAG() 函数来获取之前的时间戳值。然后将其放入 SUM() 中,仅当 val 值小于 5 的下限或大于 6 的上限时才添加增量。

SELECT 
    lowSum = SUM(CASE WHEN val < 5 THEN DATEDIFF(minute,RowDate,LAG(RowDate) OVER (ORDER BY RowDate ASC)) END)
    ,highSum = SUM(CASE WHEN val > 6 THEN DATEDIFF(minute,RowDate,LAG(RowDate) OVER (ORDER BY RowDate ASC)) END)
FROM TableA

【讨论】:

    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-27
    • 2014-08-03
    • 2022-12-02
    • 1970-01-01
    • 2021-02-21
    相关资源
    最近更新 更多