![](/img/trans.png)
[英]select records with a column with specific value on specific date sql server 2000
[英]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的查詢結果的第一行嗎?
僅供了解:
此外,如果在具有 (EventType = 5) 的記錄之前連續有多個記錄 (EventType = 1),則必須忽略除最后一條 (EventType = 1) 之外的所有重復記錄,因為在 (EventType = 1) 之間獲得正確的持續時間和(事件類型 = 5)。
是否可以僅使用 SQL 服務器查詢? 或者它也需要使用某種編程語言? 如C#和LINQ等。
我將您的要求理解為間隙和孤島問題的一個變體:基本上,您希望將具有相同網絡節點和狀態的連續記錄組合在一起。
這是一種方法,它將為您提供具有相同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
@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.