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

View File

@ -259,13 +259,21 @@ class XAnalysis:
qry = sa.select().where(*where_account)
sql = str(qry.compile(compile_kwargs={"literal_binds": True}))
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,
cnt1,
{select_ltv_str},
{sum_money_str}
FROM (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, uniqExact(`{quota}`) cnt1
FROM {self.game}.event
where `#event_name` = 'create_account'
where `#event_name` = '{event_n}'
AND {where_str} AND {where_account_str}
GROUP BY toDate(addHours(`#event_time`, `#zone_offset`))) as reg
left join
@ -273,11 +281,11 @@ class XAnalysis:
{sumpay_str}
from (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, `{quota}`
FROM {self.game}.event
where `#event_name` = 'create_account'
where `#event_name` = '{event_n}'
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
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}`
group by a.date) log on reg.date = log.date
order by date