数据集预警合并多条预警
场景
上一篇文档 《巧用预警推送卡片明细到个人》介绍了如何使用数据集预警推送数据明细给对应用户,但是由于每一行符合条件的数据都会单独推送一条信息,数据行数过多的情况下频繁推送反而会带来以下问题:
同一个预警内容的邮件或者消息发了N条,看了头疼?
同一个主题的内容挤得满满当当,看得眼花缭乱?
周末和节假日不想收到预警怎么办?
本文将介绍同一个收件人满足条件的数据有多行时,如何将预警合并为一条,且仅工作日推送。最终效果如下图。
实现原理
用ETL把数据聚合为每个用户只有一行数据,换行显示;判断日期是否是工作日。
实现步骤
1. 多字段拼接为一个字段
在ETL里先把数据按照日期、用户、店铺名称聚合好,然后新建计算字段,把需要在预警中显示的多个字段拼接为一个字段。
concat('店铺名称:',[店铺名称],', 达标数:',[达标数]) 或者 '店铺名称:'||[店铺名称]||', 达标数:'||[达标数]
2. 数据对齐
从上图预览结果来看,每行内容长短不一,无法像表格一样对齐,这里我们需要在“店铺名称”后面插入全角空格使数据对齐。
1)新加“添加计算列”算子,用窗口函数计算[店铺名称]的最大长度,相减得到和当前店铺名称的[长度差]:
max(length([店铺名称]))over(partition by [用户],[日期])-length([店铺名称])
2)调整2个“添加计算列”算子顺序,修改字段[内容1]公式为:
concat('店铺名称:',[店铺名称],repeat(' ',[长度差]),', 达标数:',[达标数])
3. 多行数据合并为一行,换行展示
新建「分组聚合」,按照日期、用户聚合,新建计算字段[未达标项]并拖入数值栏。
concat_ws('\n',collect_set([内容1]))
注意:换行符在ETL预览和数据集预览时无法生效,但是在前端(卡片、推送)展示时是生效的,故此时请忽略预览结果。
4. 判断节假日
新建计算字段[工作日判断]和[今天],筛选当天数据后输出数据集。如果仅需要周一到周五推送预警,则可以用函数 DAYOFWEEK(周日为1,周一为2)来筛选;如果需要精确判断工作日和所有节假日,则需要准备专门的节假日日期为表并关联,具体请参考《节假日数据区分和对比》。
case when DAYOFWEEK(current_date())>=2 and DAYOFWEEK(current_date())<=6 then 1 else 0 end
5. 设置数据集预警
注意:钉钉、企微推送消息有字符长度限制(上限512字符、非中文字数),如果超过上限则无法完整显示,这种情况建议使用邮件推送(不同版本邮件推送显示可能存在差别,待修复)或者仅在文本中显示汇总,通过链接查看卡片明细。