我有一个名为“uniqueClientsWithLifeTime”的查询结果,其中包含 clientid 及其平均生命周期(以月为单位),没有类别
Iḿ 尝试获取生命周期列的修剪平均值(删除异常值)
这是我到目前为止的查询
#upper bound and lower bound
WITH
bounds AS (
SELECT
PERCENTILE_CONT(ClientLifeTime, .25) OVER() AS lower_bound,
PERCENTILE_CONT(ClientLifeTime, .75) OVER() AS upper_bound
FROM
uniqueClientsWithLifeTime
)
SELECT
AVG(ClientLifeTime) as trimmed_mean,
FROM
uniqueClientsWithLifeTime
WHERE
ClientLifeTime > (SELECT bounds.lower_bound FROM bounds)
AND
ClientLifeTime < (SELECT bounds.upper_bound FROM bounds)
但我收到一条错误消息:
标量子查询产生多个元素 和 如果我执行 SELECTbounds.lower_bound FROMbounds 或 upper_bound,我确实会得到一个值,尽管我不确定它是否是正确的值。
我研究过的事情:
我查看了这篇文章,了解如何执行此操作,但它似乎提供了一个解决方案,说明您是否有可以按类别拆分的数据,尽管我不确定如何在 BigQuery 中实现该功能 https://tech.aaronteoh.com/bigquery-parameter-estimation/#trimmed_mean
还有另一个名为approx_quantiles的函数,它似乎是关于如何获取百分位数的更新方法,但我不知道如何实现它 https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#approx_quantiles
如有任何帮助,我们将不胜感激
当前解决方案的问题是窗口函数与聚合函数不同 - 前者不会减少(“聚合”)行数,而后者则可以。 窗口函数可能具有相同的目的,但它根本不会改变行数......
对于基于 sql 的平台来说,这是非常基本的概念,所以我真的建议回到这个基础知识: https://www.google.com/search?q=window+functions+and+aggregate+functions
从解决方案角度来看,你的第二个想法是正确的:
#upper bound and lower bound
WITH
bounds AS (
SELECT
APPROX_QUANTILES(ClientLifeTime, 100)[OFFSET(25)] AS lower_bound,
APPROX_QUANTILES(ClientLifeTime, 100)[OFFSET(75)] AS upper_bound
FROM
uniqueClientsWithLifeTime
)
SELECT
AVG(ClientLifeTime) as trimmed_mean,
FROM
uniqueClientsWithLifeTime
WHERE
ClientLifeTime > (SELECT bounds.lower_bound FROM bounds)
AND
ClientLifeTime < (SELECT bounds.upper_bound FROM bounds)
100
会将分位数转换为百分位数(对于 100 个分位数,1 个分位数 = 1 个百分位数)。
有关该功能的更多详细信息,您可以在此处找到。