核查承影看板和沙箱的数据,请教测试NB,get到了不少新东西,是为记录。
1、dws_ord_route_p_detail_fact_ds,从该表取在2020118完单的正确写法如下
注①:为什么不写ds?因为该表虽然有ds,但是kudu表,是按照用户id分区,不是按照ds分区(hive表按照ds分区)。
注②:完单条件为什么不写cancel_time is null?因为该表从底层表取数时,settlement_time已经包含cancel_time is null条件,因此,该条件可以不写。
注③为什么不取ds=‘20201118’,而是限制settle_time(发送账单时间)在18号?因为该表的ds取的是create_route_time(发单时间),所以要取完单/冒泡/呼叫的话,需要分别限制完单/冒泡/呼叫的时间。
SELECT passenger_id
FROM dws_ord_route_p_detail_fact_ds
WHERE settlement_time > '2020-11-18'
AND settlement_time < '2020-11-19'
2、dm_user_basic_char_dt该表,不是按照ds分区,是按照uuid分区,如果register_city有重复,按照register_time注册时间取最新数据,如下
SELECT passenger_uuid
,MAX(register_time)
,register_city
FROM dm_user_basic_char_dt
GROUP BY passenger_uuid
,register_city
3、提效,substr(register_time)=‘2020-11-18’,这种写法效率慢,因为这样会让每个字段都跑一遍substr,更优的写法是
register_time > '2020-11-18'
AND register_time < '2020-11-19'
4、上条写法,为什么不写register_time > =‘2020-11-18’,因为register_time > '2020-11-18’等价于register_time > ‘2020-11-18 00:00:00’
5、dws_ord_route_p_detail_fact_ds,该表有14个乘客id重复,且register_time和source皆为空,目测对常规统计结果无影响。因此在常规代码编辑中不需要考虑该情况
select a1.passenger_uuid,a2.register_time,a2.source
from
(SELECT passenger_uuid,count(passenger_uuid) as cishu
FROM pub_cockpit_db.dm_user_basic_char_dt
where ds = '20201119'
group by passenger_uuid
) a1
left join pub_cockpit_db.dm_user_basic_char_dt a2
on a1.passenger_uuid=a2.passenger_uuid
where a1.cishu > 1
and a2.ds = '20201119'