SQL Server,从非以特定列值开头的随机日期获取记录
我想从我的一个表中获取数据,该表有保持DateTime的EventTime列和值为1和5的EventType列 结果数据应按NetworkNode返回两种事件类型之间的持续时间之和,还应按NetworkNode返回将事件类型从1更改为5的次数 表的结构如下所示,不能更改: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
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