【问题标题】:SQL Server banding timepoints based on value基于值的 SQL Server 分段时间点
【发布时间】:2017-04-26 10:06:59
【问题描述】:

我在时间点上捕获了审计数据,我想汇总这些数据以显示使用 SQL Server 2014 在一段时间内值相同的位置。

以下面的示例数据为例

我想在不使用光标的情况下将其理想地转置为这个 - 你会看到输出记录了值相同的时间段,因此,相同的值可以在不同的时间段内重复(见第 3 行和第 6 行)。

我一直在将 LEAD()LAG() 视为潜在的解决方案,但是我无法理解如何使这项工作发挥作用,以便按时间划分以获得相同的价值

任何指示将不胜感激

【问题讨论】:

  • 所以您正在寻找相同的value 组,但它们只是随着时间的增加出现在连续块中?如果是这样,那么这就是某种差距和孤岛问题。
  • 您应该显示样本数据以明确此要求。您当前的数据会导致一个简单的 GROUP BY 查询,这不是您想要的。
  • 完全正确 - 您可以看到输出第 3 行和第 6 行具有相同的值,但发生在不同的时间段内。简而言之,我正在尝试将这个离散的数据流转换为更连续的结构以帮助查询
  • 编辑了问题以希望使要求更清晰

标签: sql-server aggregate lag lead


【解决方案1】:

如果列 [value] 不包含不同的数字,您可以使用此查询

 SELECT start,end,value 
 FROM (SELECT MIN(ts) start
             ,MAX(ts) end
             ,value
             ,C 
       FROM (SELECT ts
                   ,value
                   ,(ROW_NUMBER() OVER (ORDER BY ts) 
                    - ROW_NUMBER() OVER (PARTITION BY value ORDER BY ts)) C
             FROM YourTable) x
 GROUP BY value,C) y ORDER BY start

【讨论】:

  • 非常好 - 这正是我所追求的,而且效果很好 - 谢谢
  • 这是一个非常好的答案,需要牢记。这是一个link to a demo,显示了正在运行的查询。它有效。
【解决方案2】:

看了你的进一步cmet,下面的显然没有用......

我认为你可能过于复杂了。如果您正在寻找每个不同值的最小和最大 ts,那么您可以使用 MIN 和 MAX 并按值分组,例如

SELECT   MIN(ts) AS [Start]  ,
         MAX(ts) AS [End]    , 
         Value
FROM     Table
GROUP BY Value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多