SQL Server,从非以特定列值开头的随机日期获取记录

SQL Server,从非以特定列值开头的随机日期获取记录,sql,sql-server,gaps-and-islands,Sql,Sql Server,Gaps And Islands,我想从我的一个表中获取数据,该表有保持DateTime的EventTime列和值为1和5的EventType列 结果数据应按NetworkNode返回两种事件类型之间的持续时间之和,还应按NetworkNode返回将事件类型从1更改为5的次数 表的结构如下所示,不能更改: CREATE TABLE [dbo].[Events] ( [EventID] [INT] NOT NULL, [EventTime] [DATETIME] NULL, [NetworkNode] [I

我想从我的一个表中获取数据,该表有保持DateTime的EventTime列和值为1和5的EventType列

结果数据应按NetworkNode返回两种事件类型之间的持续时间之和,还应按NetworkNode返回将事件类型从1更改为5的次数

表的结构如下所示,不能更改:

CREATE TABLE [dbo].[Events]
(
    [EventID] [INT] NOT NULL,
    [EventTime] [DATETIME] NULL,
    [NetworkNode] [INT] NULL,
    [EventType] [SMALLINT] NULL,
    [Message] [NVARCHAR](MAX) NULL,
    [NetObjectType] [VARCHAR](10) NULL,

    CONSTRAINT [PK_Events] 
        PRIMARY KEY NONCLUSTERED ([EventID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
表中插入的样本数据如下:

1表示连接超时,5表示连接再次响应

因此,在显示5个值之前,它可能会连续有多行具有1个值的EventType

获取数据的过滤器是EventTime。例如,我必须从30天前获取数据,因此,当我尝试按当前日期前30天进行筛选时,结果的第一行可能会返回5作为EventType值,并使持续时间为负数

是否有任何方法可以删除EventType值条件为5的查询结果的第一行

只是为了理解:

如果result0['EventType']=5,则删除result0 此外,如果在EventType=5的记录之前连续有多条记录的EventType=1,则必须忽略除last之外的所有EventType=1的重复记录,以获得EventType=1和EventType=5之间的正确持续时间


是否只能使用SQL server查询?或者它也需要使用一些编程语言?例如C和LINQ等。

@Larnu很抱歉我的问题格式不好

以下是表中插入数据的10行:

EventID EventTime                   NetworkNode     EventType
1       2019-11-10 15:34:00.000     3               1
2       2019-11-10 15:46:00.000     3               5
3       2019-11-10 16:08:00.000     5               1
4       2019-11-10 16:28:00.000     5               5
5       2019-11-10 16:36:00.000     5               1
6       2019-11-10 16:46:00.000     5               5
7       2019-11-11 10:18:00.000     9               1
8       2019-11-11 10:26:00.000     9               5
9       2019-11-11 13:45:00.000     9               1
10      2019-11-11 13:51:00.000     9               5
我试图通过下面的查询获得结果,结果很好,但当我想按NetworkNode对行进行分组时,会出现如下错误:

列“Events.EventID”在选择列表中无效,因为它是 不包含在聚合函数或GROUP BY子句中


我将您的需求理解为缺口和孤岛问题的一种变体:基本上,您希望将具有相同网络节点和状态的连续记录组合在一起

这里有一种方法可以为您提供具有相同NetworkNode和EventType的每个记录系列的第一个和最后一个EventID,以及该系列中的事件数、开始和结束EventTime及其差异(以分钟为单位)

select 
    NetworkNode,
    EventType,
    min(EventID) FirstEventID,
    max(EventID) LastEventID,
    count(*) EventCount
    min(EventTime) FirstEventTime,
    max(EventTime) LastEventTime,
    datediff(minute, min(EventTime), max(EventTime)) Duration
from (
    select
        e.*,
        row_number() over(partition by NetworkNode order by EventTime) rn1,
        row_number() over(partition by NetworkNode, EventType order by EventTime) rn2
    from events e
) e
group by 
    NetworkNode, 
    EventType, 
    rn1 - rn2

非常感谢@GMB,这里的查询及其结果与我的预期非常接近,但我知道有一些问题,这是因为我的概念传递不好

查询:

select 
    NetworkNode,
    EventType,
    min(EventID) FirstEventID,
    max(EventID) LastEventID,
    count(*) EventCount
    min(EventTime) FirstEventTime,
    max(EventTime) LastEventTime,
    datediff(minute, min(EventTime), max(EventTime)) Duration
from (
    select
        e.*,
        row_number() over(partition by NetworkNode order by EventTime) rn1,
        row_number() over(partition by NetworkNode, EventType order by EventTime) rn2
    from events e
) e
group by 
    NetworkNode, 
    EventType, 
    rn1 - rn2
结果:

Node    Event    FirstEvent  LastEvent  EventCount  FirstEventTime          LastEventTime           Duration
24      1        13191615    13191615   1           2019-11-16 22:12:14.000 2019-11-16 22:12:14.000 0
24      5        13191653    13191653   1           2019-11-16 22:14:35.000 2019-11-16 22:14:35.000 0
25      1        12072600    12072600   1           2019-10-22 12:53:34.000 2019-10-22 12:53:34.000 0
25      5        12074438    12074438   1           2019-10-22 14:19:48.000 2019-10-22 14:19:48.000 0
26      1        12740974    12741155   4           2019-11-02 12:47:41.000 2019-11-02 12:47:53.000 12
26      1        12741302    13039438   2           2019-11-02 12:48:07.000 2019-11-10 15:03:00.000 699293
26      5        12741301    12741301   1           2019-11-02 12:48:07.000 2019-11-02 12:48:07.000 0
26      5        13039471    13039471   1           2019-11-10 15:05:07.000 2019-11-10 15:05:07.000 0
预期结果:

NetworkNode | Count of Happening | Sum of Duration for all Happenings (Min or Sec)
24          | 10                 | 50
25          | 14                 | 46
26          | 29                 | 128
27          | 3                  | 7
28          | 21                 | 39
29          | 75                 | 481

*****发生的意义**:每个网络节点的事件类型1到事件类型5之间的持续时间。

请以表格文本形式向我们显示一个小数据集和相应的预期结果,以便我们确定您的预期。还有,你试过什么了吗?数据的图像真的没有帮助;除非你真的希望我们能拿到成绩单你不应该的。而是将数据以表格格式的文本或DDL和DML语句的形式发布。请同时向我们展示您的预期结果,以及您的尝试。根据您的描述,您正在寻找一个缺口和孤岛解决方案;这里有很多关于堆栈溢出的例子。请查看这些记录并描述它们没有帮助的原因。非常感谢您的回答,但请注意,您的查询结果没有分组NetworkNode,并且大多数行的持续时间为0,因为相同的记录位于DATEDIFF中。我将把结果作为一个新的答案发送到这个帖子。请先看一下我发的图片。例如,对于第1行和第2行,NetworkNode为3,第1行EventType为1,第2行EventType为5,预期结果应显示这两个事件之间的持续时间15:34-15:36,以及NetworkNode 3的最后持续时间总和。唯一的条件是结果不能以EventType 5开头。
NetworkNode | Count of Happening | Sum of Duration for all Happenings (Min or Sec)
24          | 10                 | 50
25          | 14                 | 46
26          | 29                 | 128
27          | 3                  | 7
28          | 21                 | 39
29          | 75                 | 481