我在为我给你带来的 case 制定有效的解决方案/查询时遇到了问题.

我有一个接收代理数据的表.我需要的是一种方法,找出匹配的"配对",按天和事件,以便将它们插入临时表中,以便它们可以工作.同一天可以有多个条目/对.

我所说的一个例子:

Event Date AGENT Event Type Event Subtype
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 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

在这种情况下,第一个代理1的"语音通道"+"登录"应与第一个代理1的"语音通道"+"注销"配对,第一个"中断"+"开始"应与第一个"中断"+"结束"配对,第二个代理1的"语音通道"+"登录"应与第二个代理1的"语音通道"+"注销"配对,第二个"中断"+"开始"应与第二个"中断"+"结束"配对,等等

目标临时表将包含"代理"、"事件"、"事件开始"和"事件结束"列.

@代码1991最终的温度表应该是这样的:

AGENT Event Type Event Start Event End
AGENT 1 VOICE CHANNEL 2022-03-14 09:00 2022-03-14 13:00
AGENT 1 BREAK 2022-03-14 11:10 2022-03-14 11:20
AGENT 1 VOICE CHANNEL 2022-03-14 14:00 2022-03-14 18:00
AGENT 1 BREAK 2022-03-14 15:50 2022-03-14 16:00
AGENT 2 TICKET CHANNEL 2022-03-14 10:00 2022-03-14 14:00
AGENT 2 BREAK 2022-03-14 12:00 2022-03-14 12:10

欢迎提出任何建议/意见.

提前谢谢大家,祝你们一周愉快.

推荐答案

你可以使用一个缺口和岛屿的技巧.

A ranking can be calculated via using a SUM OVER a flag.
And the flag is the start of the types per agent.

一旦你有了排名,这只是一个聚合的问题.

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
AGENT   | Event Type     | Event Start      | Event End       
:------ | :------------- | :--------------- | :---------------
AGENT 1 | VOICE CHANNEL  | 2022-03-14 09:00 | 2022-03-14 13:10
AGENT 1 | BREAK          | 2022-03-14 11:10 | 2022-03-14 11:20
AGENT 1 | VOICE CHANNEL  | 2022-03-14 14:00 | 2022-03-14 18:10
AGENT 1 | BREAK          | 2022-03-14 15:50 | 2022-03-14 16:00
AGENT 2 | TICKET CHANNEL | 2022-03-14 10:00 | 2022-03-14 14:00
AGENT 2 | BREAK          | 2022-03-14 12:00 | 2022-03-14 12:10

db<>fiddle 100演示

Sql相关问答推荐

在SQL中对字符串进行逻辑排序,将数字部分排序为数字值

提取Snowflake SQL中的嵌套键

SQL JOIN of 2 Table with 2 sum

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

如何在postgres函数中插入后返回布尔值?

SQL:计算与另一列中给定值互斥的匹配项

通过之前的连接-这是Oracle的错误吗?

查找表中特定值的上次更新日期

按日期时间(不包括秒)连接表

使用列表作为参数进行 Select ,如果为空,则在PostgreSQL中不使用参数进行 Select

如何在presto中映射id与名称

SQL到Snowflake-转换嵌套的SELECT(值

STContains、STIntersections和STWithin返回错误的地理结果

将二维数组的第一个和第二个元素取消嵌套到两个一维数组中

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

特殊条件计算小计

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

在没有订单的情况下,如何生成一个值为0的顾客天数行

达到特定值时,从0开始累加求和

我现在如何显示重复的汽车? postgresql