SQL 基于值的服务器分段时间点
SQL Server banding timepoints based on value
我有随时间点捕获的审计数据,我想使用 SQL Server 2014 汇总这些数据以显示在一段时间内值相同的位置。
采用以下示例数据
我想在不使用光标的情况下将它理想地转换为这个 - 你会看到输出正在记录值相同的时间段,因此,相同的值可以在不同的时间段重复(见第 3 行和第 6 行)。
我一直在寻找 LEAD()
和 LAG()
作为潜在的解决方案,但是我无法弄清楚如何使这项工作能够按时间划分为相同的值
任何方向将不胜感激
看到你的进一步评论,下面显然没有用...
我认为你可能把它复杂化了。如果您正在寻找每个不同值的最小和最大 ts,那么您可以只使用 MIN & MAX 并按值分组,例如
SELECT MIN(ts) AS [Start] ,
MAX(ts) AS [End] ,
Value
FROM Table
GROUP BY Value
如果列 [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
我有随时间点捕获的审计数据,我想使用 SQL Server 2014 汇总这些数据以显示在一段时间内值相同的位置。
采用以下示例数据
我想在不使用光标的情况下将它理想地转换为这个 - 你会看到输出正在记录值相同的时间段,因此,相同的值可以在不同的时间段重复(见第 3 行和第 6 行)。
我一直在寻找 LEAD()
和 LAG()
作为潜在的解决方案,但是我无法弄清楚如何使这项工作能够按时间划分为相同的值
任何方向将不胜感激
看到你的进一步评论,下面显然没有用...
我认为你可能把它复杂化了。如果您正在寻找每个不同值的最小和最大 ts,那么您可以只使用 MIN & MAX 并按值分组,例如
SELECT MIN(ts) AS [Start] ,
MAX(ts) AS [End] ,
Value
FROM Table
GROUP BY Value
如果列 [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