收到业务反馈在使用报表时,筛选条件没有变,每次查询结果出的总条数都在变化
排查发现如果没有条件筛选,总条数不变
那问题就可能出在筛选项里,业务当时使用了两个筛选项
首先进行复现,复现确认确实存在问题,能稳定复现。
然后再找问题触发点
有多个筛选条件我们一个个试看哪个条件有问题,下单时间筛选单独筛的时候每次结果是一定的,一旦加上这个交易完成时间就每次都变化了,那证明交易完成时间这个字段的筛选是存在问题的
完整SQL就不贴了,太长了,贴关键行
交易完成时间的取值为
b.create_time as 交易完成时间,
交易完成时间用到的b表的SQL为
left join (
select
*
from
(
select
tos.order_id order_id,
tos.create_time create_time,
ROW_NUMBER () over(PARTITION by tos.order_id
order by
tos.create_time desc) as rn
from
prod.ods_order_order_status tos
left join prod.ods_order_order_info toi on
tos.order_id = toi.order_id
where
CASE
WHEN toi.order_type = '邮寄回收' THEN tos.order_status_name = '交易完成'
when toi.order_type = '门店回收' then tos.order_status_name = '待门店发货'
ELSE tos.order_status_name = '待收货'
END ) t
where
rn = 1
) b ON
oi.order_id = b.order_id
ROW_NUMBER () 函数为取当前行号,over(PARTITION by tos.order_id order by tos.create_time desc) 该表达式为根据tos.order_id分组,分组内根据tos.create_time降序排序
这样做的目的是取处于这个状态的最新一次记录的时间
使用group by 改写后恢复正常
left join (
select
tos.order_id order_id,
max(tos.create_time) create_time
from
prod.ods_order_order_status tos
left join prod.ods_order_order_info toi on
tos.order_id = toi.order_id
where CASE
WHEN toi.order_type = '邮寄回收' THEN tos.order_status_name = '交易完成'
when toi.order_type = '门店回收' then tos.order_status_name = '待门店发货'
ELSE tos.order_status_name = '待收货' END
group by tos.order_id
) b ON
oi.order_id = b.order_id
memo:粗略看了下网上也没啥相关答疑,作为java开发还有需求要做没有时间去追究其中原有,暂不考虑深入追究原因了。有懂的大数据老哥帮忙在评论区解答下