获取开始和结束标志之间的所有行
Posted
技术标签:
【中文标题】获取开始和结束标志之间的所有行【英文标题】:Get all rows between start and end flag 【发布时间】:2019-10-14 13:13:19 【问题描述】:我有一个类似的数据结构
Parameter | Value | DateTime
----------------------------
Switch | "on" | 2019-10-13 15:01:25
Temp | 25 | 2019-10-13 15:01:37
Pressure | 1006 | 2019-10-13 15:01:53
...
Temp | 22 | 2019-10-13 15:04:41
Switch | "off" | 2019-10-13 15:04:59
...
Switch | "on" | 2019-10-13 17:14:51
Temp | 27 | 2019-10-13 17:15:07
...
Switch | "off" | 2019-10-13 17:17:43
在每对开关“开”和“关”之间,我必须计算参数的值,即平均值或最大值/最小值等。如何让不同的数据集有多个组进行计算?
我认为这应该可以解决 - 存储过程(语句?) - SSIS 包(如何?) - .NET 应用程序。
解决此问题的最佳方法可能是什么?
提前致谢。
更新
这是表格的完整结构。
CREATE TABLE [schema].[foo]
(
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[Group] VARCHAR(20) NOT NULL,
[Parameter] VARCHAR(50) NOT NULL,
[Type] VARCHAR(50) NOT NULL,
[Timestamp] DATETIME NOT NULL,
[Value] NVARCHAR(255) NOT NULL,
[Unit] VARCHAR(10) NOT NULL,
// Only for logging. No logic for the use case.
[InsertedTimestampUtc] DATETIME NOT NULL DEFAULT(GetUtcDate()),
[IsProcessed] INT NOT NULL DEFAULT(0)
)
【问题讨论】:
是否有用于确定记录顺序的列,例如日期时间或递增 id?还请在此处从您的示例数据中包含您想要的结果,以便我们更好地了解您的目标。 你的数据结构是一个表?还是连接不同表的结果?您的预期输出是什么? 是的。该表包含一个日期字段。我将其附加到示例中。 @mburm 你能分享一下你的表结构吗?Switch
= 'On'
的行是否总是跟在Switch
= 'Off'
的行后面?
【参考方案1】:
如果我正确理解您的问题,下一个方法可能有助于获得预期的结果:
表:
CREATE TABLE #Data (
[DateTime] datetime,
[Parameter] varchar(50),
[Value] varchar(10)
)
INSERT INTO #Data
([DateTime], [Parameter], [Value])
VALUES
('2019-10-13T15:01:25', 'Switch', 'on'),
('2019-10-13T15:01:37', 'Temp', '25'),
('2019-10-13T15:01:53', 'Pressure', '1006'),
('2019-10-13T15:04:41', 'Temp', '22'),
('2019-10-13T15:04:59', 'Switch', 'off'),
('2019-10-13T17:14:51', 'Switch', 'on'),
('2019-10-13T17:15:07', 'Temp', '27'),
('2019-10-13T17:17:43', 'Switch', 'off')
声明:
;WITH ChangesCTE AS (
SELECT
*,
CASE WHEN [Parameter] = 'Switch' AND [Value] = 'on' THEN 1 ELSE 0 END AS ChangeIndex
FROM #Data
), GroupsCTE AS (
SELECT
*,
SUM(ChangeIndex) OVER (ORDER BY [DateTime]) AS GroupIndex
FROM ChangesCTE
)
SELECT [GroupIndex], [Parameter], AVG(TRY_CONVERT(int, [Value]) * 1.0) AS [AvgValue]
FROM GroupsCTE
WHERE [Parameter] <> 'Switch'
GROUP BY [GroupIndex], [Parameter]
结果:
GroupIndex Parameter AvgValue
1 Pressure 1006.000000
1 Temp 23.500000
2 Temp 27.000000
【讨论】:
以上是关于获取开始和结束标志之间的所有行的主要内容,如果未能解决你的问题,请参考以下文章