【发布时间】:2015-06-03 12:58:41
【问题描述】:
看来我走到了死胡同。我正在从 Informix 数据库(思科呼叫中心数据)中提取数据,并尝试编写一个查询来显示每个代理状态的持续时间。我从中提取的表 (agentstatedetail) 中有 4 列:agentid、eventdatetime、eventtype 和 reasoncode。查询的目的是获取每个事件类型的持续时间。查询运行良好,但存在一个主要缺陷。当代理状态(对于相同的代理 ID)同时发生(下一个事件类型的事件日期时间相同)时,我的查询返回重复项,因为在我的子查询中我有 eventdatetime>asd1.eventdatetime。基本上我需要创建第二个 eventdatetime 列并将每一行向上移动 1,其中 agentid=agentid。我尝试使用 MIN 函数,但是正如我上面所说的,这个逻辑是有缺陷的,因为一些事件同时发生。我在下面粘贴了我的代码。我已经尝试创建一个索引表,但是因为我无法为我写入数据库,这不是一个选项。 另一种说法是,无论 agentid=agentid 的位置如何,我怎么说都取下一行?任何建议都会非常有帮助。谢谢!
照片链接: https://goo.gl/photos/sqM8GYdDZLrD3jAAA: 查询结果 https://goo.gl/photos/5E68jvwadjA5y5zZA:想要的结果 - 即 21 原因代码 = 午餐
表架构: (agentID:状态发生变化的agent的标识符,int,NOT NULL,Primary Key)
(eventDateTime: 代理状态改变的日期和时间。datetime year to fraction (3), NOT NULL, Primary Key)
(eventType: 触发代理状态变化的事件: smallint, NOT NULL, Primary Key)
(reasonCode: Null 如果没有配置原因码, smallint, NOT NULL, Primary Key)
select res.resourcename,
DATE(asd1.eventdatetime) as Date,
asd1.eventdatetime as starttime,
asd2.eventdatetime as endtime,
((asd2.eventdatetime-asd1.eventdatetime)::interval second(9) to second::char(10)::int) as duration,
asd1.reasoncode as reasoncodenum
from agentstatedetail asd1
join agentstatedetail asd2
on asd1.agentid=asd2.agentid
and asd2.eventdatetime = (select min(eventdatetime)
from agentstatedetail
where agentid = asd1.agentid
and eventdatetime>asd1.eventdatetime)
left join resource res on asd1.agentid=res.resourceid
where asd1.agentid=asd2.agentid
【问题讨论】:
-
不是答案,但为什么不将所有代码和描述存储在单独的表中?然后您可以加入并获取更改,现在所有查询都必须在代码更改时更新。
-
@jarlh 我没有写权限,不幸的是,这个数据库是由异地的其他人管理的。