在大查询中没有分类的情况下被修剪意味着

问题描述 投票:0回答:1

我有一个名为“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,我确实会得到一个值,尽管我不确定它是否是正确的值。

我研究过的事情:

  1. 我查看了这篇文章,了解如何执行此操作,但它似乎提供了一个解决方案,说明您是否有可以按类别拆分的数据,尽管我不确定如何在 BigQuery 中实现该功能 https://tech.aaronteoh.com/bigquery-parameter-estimation/#trimmed_mean

  2. 还有另一个名为approx_quantiles的函数,它似乎是关于如何获取百分位数的更新方法,但我不知道如何实现它 https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#approx_quantiles

如有任何帮助,我们将不胜感激

google-bigquery
1个回答
0
投票

当前解决方案的问题是窗口函数与聚合函数不同 - 前者不会减少(“聚合”)行数,而后者则可以。 窗口函数可能具有相同的目的,但它根本不会改变行数......

对于基于 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 个百分位数)。

有关该功能的更多详细信息,您可以在此处找到。

© www.soinside.com 2019 - 2024. All rights reserved.