SQL如何仅当组遵循某些规则时才查找组的多个和的平均值

SQL如何仅当组遵循某些规则时才查找组的多个和的平均值,sql,google-bigquery,bigdata,Sql,Google Bigquery,Bigdata,这是我目前的代码: 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

这是我目前的代码:

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新手。

下面是关于BigQuery标准SQL的

标准SQL 选择DUID、AVGTOTEXP15作为平均值 来自“OmniHealth.New2015数据” 按DUID分组
下面的MINBMINDX53>=0和MAXBMINDX53用于BigQuery标准SQL

标准SQL 选择DUID、AVGTOTEXP15作为平均值 来自“OmniHealth.New2015数据” 按DUID分组
让MINBMINDX53>=0和MAXBMINDX53考虑连接两个基于计数匹配的聚合查询派生表,以将所有家庭成员与具有特定条件的所有家庭成员对齐

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

考虑连接两个基于计数匹配的聚合查询派生表,以将所有家庭成员与具有特定条件的所有家庭成员对齐

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,我会得到一个较低的数字来表示较高的家庭规模,一次尝试我会得到一个超低的数字,而这是不应该的。你能解释一下计数*作为GrpCount在这方面做了什么吗?如果没有样本数据,我将无能为力。但您的问题可能是数据问题,而不是SQL逻辑。要检查基础记录,请替换平均值。。。在带星号*的外部查询中。然后,检查特定DUID下的hhld成员。手动计算要验证的总exp和Count*基本上统计组中的记录。由于您需要所有家庭成员都符合您的条件,因此条件组计数应等于完整组计数。如果我添加*来代替AVGt1.famTotal,我会从Google BigQuery中得到以下错误:错误:语法错误:意外关键字[1:10]。但是,当我在两个内部查询中添加WHERE限定符时,当我输入我找到的特定DUID时,我得到null。这很接近,但它提供的数据我知道是不正确的。例如,当我尝试使用不同的家庭规模时,例如3,我会得到一个较低的数字来表示较高的家庭规模,一次尝试我会得到一个超低的数字,而这是不应该的。你能解释一下计数*作为GrpCount在这方面做了什么吗?如果没有样本数据,我将无能为力。但您的问题可能是数据问题,而不是SQL逻辑。要检查基础记录,请替换平均值。。。在带星号*的外部查询中。然后,检查特定DUID下的hhld成员。手动计算要验证的总exp和Count*基本上统计组中的记录。由于您需要所有家庭成员都符合您的条件,因此条件组计数应等于完整组计数。如果我添加*来代替AVGt1.famTotal,我会从Google BigQuery中得到以下错误:错误:语法错误:意外关键字[1:10]。但是,当我在两个内部查询中添加WHERE限定符时,当我输入我找到的特定DUID时,我得到null。