sql-server - 获取开始和结束标志之间的所有行
问题描述
我有一个类似的数据结构
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)
)
解决方案
如果我正确理解您的问题,则下一种方法可能有助于获得预期结果:
桌子:
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
推荐阅读
- vb.net - 将事件添加到项目中的所有表单
- php - 如何使用 PHP 对图像进行分页?
- python - Python 堆栈跟踪解释 - 'NoneType' 对象不可迭代,但没有循环
- java - Android如何在单击按钮时更改底部导航项的颜色
- python - python中的列表
- javascript - PHP while循环第一个按钮不起作用
- .htaccess - 我所有子域上的 500 内部服务器错误
- asp.net - 异步操作超过了页面超时(尝试将 HttpRequestMessage 与 ASP.NET WebForms 页面一起使用)
- ios - Ios Swift 日期从 TimeZone 转换
- python - 仅为父进程注册 SIGTEM 处理程序