我在為我帶給您的案例開發可行的解決方案/查詢時遇到問題。
我有一個接收代理資料的表。我需要的是一種按天和事件找出匹配的“對”的方法,以便將它們插入臨時表中,以便它們可以作業。同一天可以有多個條目/對。
我正在談論的一個示例:
| 活動日期 | 代理人 | 事件型別 | 事件子型別 |
|---|---|---|---|
| 2022-03-14 09:00 | 特工 1 | 語音通道 | 登錄 |
| 2022-03-14 11:10 | 特工 1 | 休息 | 開始 |
| 2022-03-14 11:20 | 特工 1 | 休息 | 結尾 |
| 2022-03-14 13:10 | 特工 1 | 語音通道 | 登出 |
| 2022-03-14 14:00 | 特工 1 | 語音通道 | 登錄 |
| 2022-03-14 15:50 | 特工 1 | 休息 | 開始 |
| 2022-03-14 16:00 | 特工 1 | 休息 | 結尾 |
| 2022-03-14 18:10 | 特工 1 | 語音通道 | 登出 |
| 2022-03-14 10:00 | 特工 2 | 票務頻道 | 登錄 |
| 2022-03-14 12:00 | 特工 2 | 休息 | 開始 |
| 2022-03-14 12:10 | 特工 2 | 休息 | 結尾 |
| 2022-03-14 14:00 | 特工 2 | 票務頻道 | 登出 |
在這種情況下,第一個代理 1 'voice channel' 'login' 應該與第一個代理 1 'voice channel' 'logout' 配對,第一個 'break' 'start' 應該與第一個'break'配對 'end',第二個agent 1'voice channel' 'login'和第二個agent 1'voice channel' 'logout'和第二個'break' 'start' with 第二個'break' 'end' ,等等。
目標臨時表將包含“代理”、“事件”、“事件開始”和“事件結束”列。
@Coder1991 最終的臨時表應該是這樣的:
| 代理人 | 事件型別 | 活動開始 | 活動結束 |
|---|---|---|---|
| 特工 1 | 語音通道 | 2022-03-14 09:00 | 2022-03-14 13:00 |
| 特工 1 | 休息 | 2022-03-14 11:10 | 2022-03-14 11:20 |
| 特工 1 | 語音通道 | 2022-03-14 14:00 | 2022-03-14 18:00 |
| 特工 1 | 休息 | 2022-03-14 15:50 | 2022-03-14 16:00 |
| 特工 2 | 票務頻道 | 2022-03-14 10:00 | 2022-03-14 14:00 |
| 特工 2 | 休息 | 2022-03-14 12:00 | 2022-03-14 12:10 |
任何建議/意見表示贊賞。
提前謝謝大家,祝您度過愉快的一周。
uj5u.com熱心網友回復:
為此,您可以使用 Gaps-And-Islands 技巧。
排名可以通過使用SUM OVER標志來計算。
標志是每個代理型別的開始。
一旦你有了排名,它只是一個聚合的問題。
SELECT AGENT, [Event Type] , MIN(CASE WHEN [Event SubType] IN ('LOGIN', 'START') THEN [Event Date] END) AS [Event Start] , MAX(CASE WHEN [Event SubType] IN ('LOGOUT', 'END') THEN [Event Date] END) AS [Event End] FROM ( SELECT [Event Date], AGENT, [Event Type], [Event Subtype] , Rnk = SUM(IIF([Event SubType] IN ('LOGIN', 'START'), 1, 0)) OVER (PARTITION BY AGENT, [Event Type], CAST([Event Date] AS DATE) ORDER BY [Event DATE]) FROM agent_events ) q GROUP BY AGENT, [Event Type], CAST([Event Date] AS DATE), Rnk ORDER BY AGENT, [Event Start]; GO代理 | 活動型別 | 活動開始 | 活動結束 :-------- | :------------- | :--------------- | :--------------- 特工 1 | 語音頻道 | 2022-03-14 09:00 | 2022-03-14 13:10 特工 1 | 休息 | 2022-03-14 11:10 | 2022-03-14 11:20 特工 1 | 語音頻道 | 2022-03-14 14:00 | 2022-03-14 18:10 特工 1 | 休息 | 2022-03-14 15:50 | 2022-03-14 16:00 特工 2 | 票務頻道 | 2022-03-14 10:00 | 2022-03-14 14:00 特工 2 | 休息 | 2022-03-14 12:00 | 2022-03-14 12:10
關于db<>fiddle的演示在這里
uj5u.com熱心網友回復:
請嘗試以下方法
declare @tbl table([Event Date] datetime,AGENT varchar(10),[Event Type]
varchar(20)
,[Event Subtype] varchar(20)
)
insert into @tbl
values('2022-03-14 09:00','AGENT 1','VOICE CHANNEL','LOGIN')
,('2022-03-14 11:10','AGENT 1','BREAK','START')
,('2022-03-14 11:20','AGENT 1','BREAK','END')
,('2022-03-14 13:10','AGENT 1','VOICE CHANNEL','LOGOUT')
,('2022-03-14 14:00','AGENT 1','VOICE CHANNEL','LOGIN')
,('2022-03-14 15:50','AGENT 1','BREAK','START')
,('2022-03-14 16:00','AGENT 1','BREAK','END')
,('2022-03-14 18:10','AGENT 1','VOICE CHANNEL','LOGOUT')
,('2022-03-14 19:00','AGENT 1','VOICE CHANNEL','LOGIN')
,('2022-03-14 20:10','AGENT 1','VOICE CHANNEL','LOGOUT')
,('2022-03-14 10:00','AGENT 2','TICKET CHANNEL','LOGIN')
,('2022-03-14 12:00','AGENT 2','BREAK','START')
,('2022-03-14 12:10','AGENT 2','BREAK','END')
,('2022-03-14 14:00','AGENT 2','TICKET CHANNEL','LOGOUT')
select *
, case when ROW_NUMBER()over(partition by agent,[Event Type] order by [Event Date]) % 2
!= 0 then [Event Date] else null end
[Event Start]
,case when ROW_NUMBER()over(partition by agent,[Event Type] order by [Event Date]) % 2
= 0 then [Event Date] else null end
[Event End]
into #temp
from @tbl
;with cte as(
select AGENT,[Event Type],[Event Start]
,lead([Event End],1)over(partition by agent,[Event Type] order by [Event Date]) [Event End]
from
#temp
)
select *
from cte
where [Event Start] is not null
order by AGENT,[Event Start]
drop table #temp
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443773.html
下一篇:Sql按多個子句分組
