SQL 查询优化:计算过去 31 天的活跃应用数量和新增应用数量
尝试修改以下部分:
-
在第4行的'as'后添加一个变量名
-
在第11行的'as'后添加一个变量名
修改后的代码如下:
SELECT ts,
if(
i >= 31,
length(
arrayDistinct(arrayFlatten(arraySlice(total, i -30, 31)))
),
length(
arrayDistinct(arrayFlatten(arraySlice(total, 1, i)))
)
) as total_num,
if(
i >= 31,
arraySum(arraySlice(total_increase, i -30, 31)),
arraySum(arraySlice(total_increase, 1, i))
) as total_increase_num
FROM (
SELECT ts1,
if(
i >= 31,
length(
arrayDistinct(arrayFlatten(arraySlice(total, i -30, 31)))
),
length(
arrayDistinct(arrayFlatten(arraySlice(total, 1, i)))
)
) as total_num
FROM (
SELECT groupArray(A.Ds) as ts1,
groupArray(app_id_list) as total
from (
SELECT Ds,
groupArray(AppIdentifier) as app_id_list
FROM (
select AppIdentifier,
Ds
from log_iMonkey_iOS_overview
GROUP BY AppIdentifier,
Ds
)
GROUP BY Ds
order by Ds
) A
)
JOIN t as ts1,
arrayEnumerate(t) as i
where ts >= toDate(
#monthly_active_new_business.start#)
left join (
SELECT ts2,
total_increase,
total_increase [i] as total_increase_num
FROM (
SELECT groupArray(Ds) as t,
groupArray(app_count) as total_increase
from (
SELECT min_Ds as Ds,
count(distinct AppIdentifier) as app_count
FROM (
select AppIdentifier,
min(Ds) as min_Ds
from log_iMonkey_iOS_overview
GROUP BY AppIdentifier
)
GROUP BY min_Ds
order by min_Ds
)
) C
JOIN t as ts2,
arrayEnumerate(t) as i
where ts >= toDate(
#monthly_active_new_business.start#)
)
ON ts1 = C.ts2
JOIN t as ts,
arrayEnumerate(t) as i
where ts >= toDate(
#monthly_active_new_business.start#)
代码解释:
- 该 SQL 查询用于计算过去 31 天的活跃应用数量和新增应用数量。
- 查询语句首先创建了一个子查询,用于获取每天的活跃应用数量。子查询使用
arrayDistinct和arrayFlatten函数去重并扁平化应用 ID 列表,然后使用length函数获取列表的长度,即活跃应用数量。 - 另一个子查询用于获取每天的新增应用数量。子查询使用
count(distinct AppIdentifier)函数统计每天的新增应用数量。 - 最后,主查询将两个子查询的结果合并,并使用
if函数根据日期判断是取过去 31 天的累加值还是当前日期之前的累加值。
错误修正:
- 原始代码中,
groupArray(A.Ds) as和groupArray(Ds) as语句缺少变量名,导致 SQL 解析异常。 - 修改后的代码在
as后添加了ts1和t变量名,修复了该错误。
总结:
通过添加变量名,修复了原始代码中的语法错误,并提供了详细的代码解释,方便读者理解 SQL 查询的逻辑。**
原文地址: https://www.cveoy.top/t/topic/oDwW 著作权归作者所有。请勿转载和采集!