1.优化设备ltv的计算逻辑,把诙谐的单独拿出来

2.优化底层,使得基础数据报表生成的sql是正确的
This commit is contained in:
李伟 2022-08-22 18:06:39 +08:00
parent dc3844978a
commit 77d8bbfd98
2 changed files with 17 additions and 9 deletions

View File

@ -361,7 +361,7 @@ class BehaviorAnalysis:
return event_filters, user_filters return event_filters, user_filters
async def handler_filts(self, *filters): async def handler_filts(self, *filters,nu=0):
""" """
:param filters: (filts:list,relation:str) :param filters: (filts:list,relation:str)
@ -400,8 +400,8 @@ class BehaviorAnalysis:
# 字段名 # 字段名
col = getattr(tbl.c, item['columnName']) col = getattr(tbl.c, item['columnName'])
# 判断是否是同一个事件 # 判断是否是同一个事件
yuan_event = self.events[0].get('eventName') or self.events[0].get('event_name') # 指标中的事件名 yuan_event = self.events[nu].get('eventName') or self.events[nu].get('event_name') # 指标中的事件名
biao_event = self.events[0].get('customEvent', '').split('.')[0] biao_event = self.events[nu].get('customEvent', '').split('.')[0]
event = await get_event(item['columnName'], self.game) # 获取对应事件名或基础属性 event = await get_event(item['columnName'], self.game) # 获取对应事件名或基础属性
if event != yuan_event and event != biao_event and event != '基础属性' and self.game != 'debug': if event != yuan_event and event != biao_event and event != '基础属性' and self.game != 'debug':
event_time_col = getattr(self.event_tbl.c, '#event_time') event_time_col = getattr(self.event_tbl.c, '#event_time')
@ -568,7 +568,7 @@ class BehaviorAnalysis:
"""事件分析生成sql会经过""" """事件分析生成sql会经过"""
sqls = [] sqls = []
event_time_col = getattr(self.event_tbl.c, '#event_time') event_time_col = getattr(self.event_tbl.c, '#event_time')
for event in self.events: for idx,event in enumerate(self.events):
operator_ = event.get('operator_val', '') operator_ = event.get('operator_val', '')
# 排头显示名 # 排头显示名
event_name_display = event.get('eventNameDisplay') event_name_display = event.get('eventNameDisplay')
@ -599,7 +599,7 @@ class BehaviorAnalysis:
where = [event_name_col.in_(event_name)] where = [event_name_col.in_(event_name)]
event_filter, _ = await self.handler_filts((event['filts'], event.get('relation')), event_filter, _ = await self.handler_filts((event['filts'], event.get('relation')),
(self.global_filters, self.global_relation), (self.global_filters, self.global_relation),
self.ext_filters self.ext_filters,nu=idx
) )
select_exprs.extend(self.groupby) select_exprs.extend(self.groupby)
qry = sa.select( qry = sa.select(
@ -631,7 +631,7 @@ class BehaviorAnalysis:
event_filter, user_filter = await self.handler_filts( event_filter, user_filter = await self.handler_filts(
(event['filts'], event.get('relation', 'and')), (event['filts'], event.get('relation', 'and')),
(self.global_filters, self.global_relation) (self.global_filters, self.global_relation)
, self.ext_filters , self.ext_filters,nu=idx
) )
u_account_id_col = getattr(self.user_tbl.c, '#account_id') u_account_id_col = getattr(self.user_tbl.c, '#account_id')

View File

@ -259,13 +259,21 @@ class XAnalysis:
qry = sa.select().where(*where_account) qry = sa.select().where(*where_account)
sql = str(qry.compile(compile_kwargs={"literal_binds": True})) sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
where_account_str = sql.split('WHERE ')[1] where_account_str = sql.split('WHERE ')[1]
if self.game == 'huixie' and quota == '#distinct_id':
event_n='new_device'
else:
event_n = 'create_account'
if 'is_new_device = 1' in where_str:
timed=where_str.replace('AND is_new_device = 1','',1)
else:
timed=where_str
sql = f"""SELECT reg.date as date, sql = f"""SELECT reg.date as date,
cnt1, cnt1,
{select_ltv_str}, {select_ltv_str},
{sum_money_str} {sum_money_str}
FROM (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, uniqExact(`{quota}`) cnt1 FROM (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, uniqExact(`{quota}`) cnt1
FROM {self.game}.event FROM {self.game}.event
where `#event_name` = 'create_account' where `#event_name` = '{event_n}'
AND {where_str} AND {where_account_str} AND {where_str} AND {where_account_str}
GROUP BY toDate(addHours(`#event_time`, `#zone_offset`))) as reg GROUP BY toDate(addHours(`#event_time`, `#zone_offset`))) as reg
left join left join
@ -273,11 +281,11 @@ class XAnalysis:
{sumpay_str} {sumpay_str}
from (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, `{quota}` from (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, `{quota}`
FROM {self.game}.event FROM {self.game}.event
where `#event_name` = 'create_account' where `#event_name` = '{event_n}'
AND {where_str} AND {where_account_str} ) as a AND {where_str} AND {where_account_str} ) as a
left join (select `{quota}`, unitPrice/100 as money, toDate(addHours(`#event_time`, `#zone_offset`)) as date left join (select `{quota}`, unitPrice/100 as money, toDate(addHours(`#event_time`, `#zone_offset`)) as date
from {self.game}.event from {self.game}.event
where `#event_name` = 'pay' and {where_order_str} AND {where_account_str}) b where {timed} and `#event_name` = 'pay' and {where_order_str} AND {where_account_str}) b
on a.`{quota}` = b.`{quota}` on a.`{quota}` = b.`{quota}`
group by a.date) log on reg.date = log.date group by a.date) log on reg.date = log.date
order by date order by date