按Wrap Up Code分组呼叫数据遇阻,求SQL解决方案
解决呼叫数据按Wrap Up Code分组的问题
我明白你的困扰了——同一通呼叫里的Interact、hold、wrap段本来是关联的,但因为前两个的wrapUpCode是NULL,导致分组时被单独分开,没法归到对应Wrap Up Code的组里。咱们来调整一下SQL逻辑,把同一conversationId下的NULL值统一替换成该呼叫对应的有效Wrap Up Code。
核心思路
同一通呼叫(相同conversationId)里,只有wrap类型的段会有非NULL的wrapUpCode,其他段的都是NULL。我们可以用窗口函数先为每个conversationId提取出对应的非NULL Wrap Up Code,再用这个值统一替换该呼叫所有行的wrapUpCode,之后再进行分组,就能把所有关联段归到同一组了。
修改后的SQL代码
WITH NormalizedConversations AS ( SELECT direction, conversationId, username, conversationStart, -- 提取同一通话的有效Wrap Up Code,自动忽略NULL MAX(wrapUpCode) OVER (PARTITION BY conversationId) AS normalized_wrap_up_code, DATEDIFF_BIG(MILLISECOND, segmentStart, segmentEnd) AS duration FROM dbo.vw_Conversations WHERE (purpose = 'user' OR purpose = 'agent') AND segmentType <> 'alert' ) SELECT TOP 1000 direction, conversationId, username, conversationStart, normalized_wrap_up_code AS wrapUpCode, -- 如果需要合并同一通话的总时长就用SUM,保留单段时长就去掉SUM直接用duration SUM(duration) AS total_duration FROM NormalizedConversations GROUP BY direction, conversationId, username, conversationStart, normalized_wrap_up_code;
代码说明
- CTE部分:用
MAX(wrapUpCode) OVER (PARTITION BY conversationId)为每个通话生成统一的Wrap Up Code——因为NULL在聚合函数中会被忽略,所以这个表达式会自动拿到该通话里唯一的非NULL Wrap Up Code。 - 分组部分:用归一化后的
normalized_wrap_up_code代替原来的wrapUpCode进行分组,这样同一通话的所有段都会被归到同一个Wrap Up Code组里。 - 时长处理:如果需要统计同一通话的总时长,就用
SUM(duration);如果要保留每个段的单独时长,去掉SUM和对应的GROUP BY里的duration即可(此时不需要GROUP BY,直接SELECT即可)。
这样调整后,就能得到你想要的“把NULL值归到对应SegmentType最终结果”的效果啦!
内容的提问来源于stack exchange,提问作者Pinch
相关产品推荐
相关产品推荐

