【问题标题】:SQL avg function in partition by分区中的 SQL avg 函数
【发布时间】:2021-08-23 09:43:54
【问题描述】:

我的任务是计算 3 个条件的一部分中 3 列的平均值。

这是一个源表:

我需要选择主要需求(工作或休闲)的平均值,按不同的生命年龄(年轻、活跃或老年人)、性别和工作状态分组。

为此,我使用窗口函数应用以下查询:

SELECT
    working, sex, age, 
    ROUND(AVG(primaryNeeds) OVER(w),1) primaryNeeds,
    ROUND(avg(work) OVER(w),1) work,
    ROUND(avg(other)OVER(w),1) other
FROM 
    demography
WINDOW w AS (PARTITION BY 'age', 'working', 'sex' ORDER BY 'age', 'working', 'sex')

但在结果选择中计算的平均值未按“年龄”、“工作”、“性别”列分组。

我做错了什么?

【问题讨论】:

  • 请避免将数据作为图像。您可以使用| 创建/格式化表格。
  • PARTITION BY X ORDER BY X 没有任何意义 - 根据定义,您知道分区中的所有行对这些表达式共享相同的值,因此它们不能应用任何有意义的排序区别

标签: sql window-functions


【解决方案1】:

如果要分组,只需使用 group by:

SELECT working,
       sex,
       age,
       ROUND(AVG(primaryNeeds), 1) primaryNeeds,
       ROUND(avg(WORK), 1) WORK,
       ROUND(avg(other), 1) other
FROM demography 
group by age, working, sex

【讨论】:

  • 但是“partition by”是否不适用于这种情况?
  • @Andrew 如果您分组,您会减少行数并计算聚合。如果使用窗口函数,则只需计算局部聚合而不减少行数。 Windows 函数中的partition by 等效于分组聚合的group by。如果要保持相同的行数,可以使用@gordonlinoff 的答案
【解决方案2】:

如果您想保留原始行并附加平均值,那么您就在正确的轨道上。但是,我认为问题在于 window 子句中的引号。而order by 是多余的:

SELECT d.*, 
       ROUND(AVG(primaryNeeds) OVER w, 1) as primaryNeeds,
       ROUND(avg(work) OVER w, 1) as work,
       ROUND(avg(other) OVER w, 1) as other
FROM demography d
WINDOW w AS (PARTITION BY age, working, sex)

【讨论】:

  • 这不能正常工作,从这个意义上说,“primaryNeeds, work, other”列包含平均值、计算值、没有分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
相关资源
最近更新 更多