【问题标题】: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' 的行后面?

标签: sql-server tsql grouping window-functions


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2017-10-28
    • 2015-12-28
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2021-01-01
    • 2021-09-14
    相关资源
    最近更新 更多