簡體   English   中英

SQL Server,從不以特定列值開始的隨機日期獲取記錄

[英]SQL Server, Getting records from random date where not started with specific column value

我想從我的一個表中獲取數據,該表具有 EventTime 列,該列保留 DateTime 和 EventType 列,該列的值為 1 和 5。

結果數據應按 NetworkNode 返回兩個事件類型之間的持續時間總和,還應按 NetworkNode 返回從 1 到 5 組的 EventType 更改次數。

表結構如下,不可更改:

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 值表示連接再次響應。

因此,它可能有不止一行具有 1 個值(EventType),直到出現 5 個值。

獲取數據的過濾器是EventTime。 例如,我必須從 30 天前獲取數據,因此當我嘗試按當前日期前 30 天進行過濾時,結果的第一行可能會返回 5 作為 EventType 值,並且它使持續時間為負。

有什么方法可以刪除EventType值等於5的查詢結果的第一行嗎?

僅供了解:

  • 如果 result(0)['EventType'] = 5 刪除 result(0)

此外,如果在具有 (EventType = 5) 的記錄之前連續有多個記錄 (EventType = 1),則必須忽略除最后一條 (EventType = 1) 之外的所有重復記錄,因為在 (EventType = 1) 之間獲得正確的持續時間和(事件類型 = 5)。

是否可以僅使用 SQL 服務器查詢? 或者它也需要使用某種編程語言? 如C#和LINQ等。

我將您的要求理解為間隙和孤島問題的一個變體:基本上,您希望將具有相同網絡節點和狀態的連續記錄組合在一起。

這是一種方法,它將為您提供具有相同NetworkNodeEventType的每個記錄系列的第一個和最后一個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

@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 子句中。

select
   t1.EventID,
   t1.EventTime,
   t2.EventTime,
   t1.NetworkNode,
   t1.EventType,
   t2.EventType,
   DATEDIFF(minute , t1.EventTime, t2.EventTime) as Duration 
from
   (
      select
         *,
         ROW_NUMBER() OVER(
      Order by
         eventid) as CNumber 
      from
         Events 
      where
         EventTime >= DATEADD(day, - 30, GETDATE()) 
         and NetObjectType = 'N'
         And EventType = 1
   )
   as t1 
   inner join
      (
         select
            *,
            ROW_NUMBER() OVER( Order by eventid) as CNumber 
         from
            Events 
         where
            EventTime >= DATEADD(day, - 30, GETDATE()) 
            and NetObjectType = 'N' 
            And EventType = 5
      )
      as t2 
      on t1.CNumber = t2.CNumber AND t1.NetworkNode = t2.NetworkNode

非常感謝@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 之間的持續時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM