SQL如何仅在组遵循某些规则时才找到许多组总和的平均值

Posted

技术标签:

【中文标题】SQL如何仅在组遵循某些规则时才找到许多组总和的平均值【英文标题】:SQL How to find average of many sums of groups only if the groups follow certain rules 【发布时间】:2017-12-31 01:39:02 【问题描述】:

这是我当前的代码:

SELECT
AVG(famTotal)

FROM `OmniHealth.new2015Data`, (
SELECT
SUM( TOTEXP15 ) as famTotal
FROM `OmniHealth.new2015Data` 

GROUP BY DUID
)
WHERE BMINDX53 BETWEEN 0 AND 25 AND
ADSMOK42 = -1 AND
FCSZ1231 = 7

我想要做的是找到每个家庭的平均成本,其中家庭的所有成员的 BMI 都在 0 到 25 之间,不吸烟,并且家庭规模任意。

表格中的支出数据是按人计算的,因此我尝试根据所有人的“居住单元 ID”(DUID) 对其进行求和,然后对每个人的总数进行平均家庭,只要家庭只有我在上一段中所述的属性。

感谢您的回复!我是 SQL 新手。

【问题讨论】:

【参考方案1】:

考虑加入两个在计数上匹配的聚合查询派生表,以将所有家庭成员与具有特定条件的所有家庭成员对齐。

SELECT AVG(t1.famTotal) as famTotal

FROM
  (SELECT DUID, Count(*) As GrpCount, SUM(TOTEXP15) as famTotal
   FROM `OmniHealth.new2015Data` 
   GROUP BY DUID) As t1

INNER JOIN

  (SELECT DUID, Count(*) As GrpCount
   FROM `OmniHealth.new2015Data` 
   WHERE BMINDX53 BETWEEN 0 AND 25 
     AND ADSMOK42 = -1 
     AND FCSZ1231 = 7
   GROUP BY DUID) As t2

ON t1.DUID = t2.DUID AND t1.GrpCount = t2.GrpCount

【讨论】:

这很接近,但它给了我我知道不可能正确的数据。例如,当我尝试使用不同的家庭人数(例如 3 人)时,我会为更大的家庭人数得到一个较小的数字,而尝试一次我会得到一个不应该的超低数字。你能解释一下Count(*) as GrpCount 在这方面做了什么吗? 如果没有样本数据,我将无能为力。但是您的问题可能是数据问题而不是这个 SQL 逻辑。要检查基础记录,请将外部查询中的 AVG(...) 替换为星号 *。然后,检查特定 DUID 下的 hhld 成员。手动求和总 exp 以进行验证。 Count(*)基本统计了组内的记录。由于您需要所有家庭成员都符合您的标准,因此条件组计数应等于完整组计数。 如果我添加 * 代替 AVG(t1.famTotal) 我会收到此错误:来自 Google BigQuery 的 Error: Syntax error: Unexpected keyword AS at [1:10] 但是,当我在两个内部查询中添加 WHERE 限定符时,当我输入找到的特定 DUID 时,我得到 null。【参考方案2】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT DUID, AVG(TOTEXP15) AS famAverage
FROM `OmniHealth.new2015Data` 
GROUP BY DUID
HAVING MIN(BMINDX53) >=0 AND MAX(BMINDX53) <=25
AND MIN(ADSMOK42) = -1 AND MAX(ADSMOK42) = -1
AND MIN(FCSZ1231) = 7 AND MAX(FCSZ1231) = 7

【讨论】:

以上是关于SQL如何仅在组遵循某些规则时才找到许多组总和的平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 cppcheck 忽略某些错误?

Ag 网格仅在组值之间放置边框

Sql Server:如何仅在存在时才选择列?

SQL Plus如何仅在同一帐户没有两个不同结果时才显示行

仅在满足某些条件时才调用 Safari Content Blocker 扩展?

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录