需求时间维度:2019年5月1号-至今,数据以月统计。即每个分区的数据除了当前月份的时间跨度是一号到现在来统计的,其他(历史)是按整个月统计的,,因此一个分区中最小粒度只有一条记录。
if [[ -z $1 ]]; then
datetime=`date -d "-1 days" +"%Y-%m-%d"`
else
datetime=$1
fi
nowdate=`date -d "${datetime}" +"%Y%m%d"`
ym_nowdate=`date -d "${nowdate}" +"%Y%m"`
#索引
cur_statdate=${nowdate} #"20190501" 当用于刷历史分区,打开注释
#索引年月
statdate=`date -d "${cur_statdate}" +"%Y%m"`
while [ "${ym_nowdate}" != "${statdate}" ] #当非昨天的年月时,会进入循环,用于刷历史分区
doecho "cur_statdate:${cur_statdate}" start_statdate=`date -d "${cur_statdate}" +"%Y%m01"` #月初start_datetime=`date -d "${cur_statdate}" +"%Y-%m-01"` #月初(-分隔end_statdate=`date -d "$(date -d "${start_statdate} next month" +'%Y%m01') yesterday" +"%Y%m%d"` #月末end_datetime=`date -d "${end_statdate}" +"%Y-%m-%d"` #月末(-分隔echo "start_statdate: ${start_statdate}"echo "end_statdate: ${end_statdate}"echo "statdate:${statdate}"#运行sql脚本(参数start_statdate、start_datetime、end_statdate、end_datetime用于源表做时间维度选择)cur_statdate=`date -d "${start_statdate} next month" +"%Y%m%d"` #索引以月为步进statdate=`date -d "${cur_statdate}" +"%Y%m"` #索引年月
done
start_statdate=`date -d "${cur_statdate}" +"%Y%m01"` #月初
start_datetime=`date -d "${cur_statdate}" +"%Y-%m-01"` #月初(-分隔
end_statdate=${nowdate} #月末
end_datetime=`date -d "${nowdate}" +"%Y-%m-%d"` #月末(-分隔
echo "cur_statdate:${cur_statdate}"
echo "start_statdate: ${start_statdate}"
echo "end_statdate: ${end_statdate}"
echo "statdate:${statdate}"
注意:
1、dt表是以日为分区,且含有所有数据(全量),即一个分区可查看所有历史到现在的信息,所以dt表的分区要选择最新日期。因为这里的需求是要统计历史月份,有两种源表类型,做的时间选择是不一样的:
2、d表是以日为分区,分区里只有一日的信息,所以d表的分区要选择 >= 月初 and <= 月末/昨日日期
3、最要细心的是什么呢?
当两个源表的主体关系会变动的时候,如设备所在的商户可能会变化。如果以月作时间维度分别给两张源表做选择(select),统计的数据(如商户的月利润)就会不准确。应该以日作时间维度分别给两张源表做选择,两表的关联条件包含上日期,最后再以商户为粒度(group by)做统计,这样数据才是准确的。
本文发布于:2024-02-04 18:28:24,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170713666058320.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |