背景:
公司迭代了一个需求,会将生产的数据根据指定的维度进行拆分,研发要求测试出一个数据验证脚本,去校验数据拆分的准确性。
原数据格式为:注意provider_no、channel_no字段的值,原数据格式为多对多。
产品需求为:根据operate_type、msg_type、target_type、provider_no、channel_no五个条件为维度,完成数据的拆分,使其对应字段的值有且只有一个(原本一个配置数据拆分之后,可能会有几十条配置)
脚本设计思路1:
正向思路:确定开发脚本的拆分方式=====> 将数据导出到Excel中,使用Python处理Excel完成数据拆分=====>将拆分后的数据写入Excel中=====>将开发拆分的数据导到Excel中,实现数据对比
笛卡尔集的实现:这个是在网上copy的。
重点来了!!!
此处的思路就是想办法将原数据中需要处理的字段转换成一个个小列表,然后整条数据作为一个大列表。
拆分完成之后的数据为:
脚本设计思路2:
逆向思路:判断原数据能否根据指定的维度的数据保持唯一=========>将研发拆分的数据根据指定的维度重新聚合=======>将聚合之后的数据与原数据进行对比
判断数据是否以指定维度唯一:
SELECT
t1.c1,
COUNT( 1 )
FROM
(
SELECT
CONCAT( provider_no, "-", channel_no, "-", operate_type, "-", target_type, "-", msg_type ) c1
FROM
bu_intercity.msg_tlp_setting1
WHERE
effective = '1'
GROUP BY
c1
HAVING
COUNT( c1 )> 1
) t1
这里在使用having过滤数据时,需要注意having的位置。不要写成如下sql:这样写导致筛选条件失效
SELECT
t1.c1
FROM
(
SELECT
CONCAT( provider_no, "-", channel_no, "-", operate_type, "-", target_type, "-", msg_type ) c1
FROM
bu_intercity.msg_tlp_setting1
WHERE
effective = '1'
GROUP BY
c1
) t1
HAVING
COUNT( c1 )>1
将拆分数据聚合并判断聚合后的数据与原数据是否能够完全匹配
SELECT
t1.c1
FROM
(
SELECT
CONCAT( b.provider_no, a.channel_no, a.operate_type, a.target_type, a.msg_type, a.effective ) c1
FROM
message_route1 a
INNER JOIN message_route_provider1 b ON a.setting_no = b.setting_no
) t1
WHERE
t1.c1 NOT IN ( SELECT CONCAT( provider_no, channel_no, operate_type, target_type, msg_type, effective ) FROM msg_tlp_setting1 )
SELECT
c1
FROM
( SELECT CONCAT( provider_no, channel_no, operate_type, target_type, msg_type, effective ) c1 FROM msg_tlp_setting1 ) t2
WHERE
c1 NOT IN (
SELECT
CONCAT( b.provider_no, a.channel_no, a.operate_type, a.target_type, a.msg_type, a.effective )
FROM
message_route1 a
INNER JOIN message_route_provider1 b ON a.setting_no = b.setting_no)
----------------------------------学海无涯