Xquery 使用where筛选平均值计算不起作用

Xquery 使用where筛选平均值计算不起作用,xquery,Xquery,我试图将avg(…)函数与where子句一起使用,但它不起作用: let $x := doc("boats.xml")/boats/boat/price where $x < 100000 return avg($x) 该代码适用于所有船只。为什么第一个不适用于10万艘以下的船只 这也行不通。它给了我一份10万以下的价格清单: for $x in doc("boats.xml")/boats/boat

我试图将
avg(…)
函数与
where
子句一起使用,但它不起作用:

let $x := doc("boats.xml")/boats/boat/price
           where $x < 100000
           return avg($x)
该代码适用于所有船只。为什么第一个不适用于10万艘以下的船只

这也行不通。它给了我一份10万以下的价格清单:

 for $x in doc("boats.xml")/boats/boat
                    where $x/price<100000
                    return avg($x/price)
文件中的$x(“boats.xml”)/boats/boat

如果$x/price返回
$x
而不是计算平均值,则问题很容易被揭示:您的第一个查询将
$x
声明为所有价格的序列(因此
$x
在下面的示例文档中是
(50000、80000、150000)
)<因此,code>$x<100000
(50000、80000、150000)<100000
,它以基于集合的方式进行计算,如果序列中的任何元素小于100000,则验证为
true
avg($x)
最后再次获取原始列表并计算其平均值

您的第三个查询是实现预期解决方案的良好起点(并正确过滤),但由于您计算每个奖金的平均奖金,而不是所有奖金的实际平均值,因此将失败

由于您没有提供示例输入,我定义了以下内容:

let $boats := document {
  <boats>
    <boat>
      <price>50000</price>
    </boat>
    <boat>
      <price>80000</price>
    </boat>
    <boat>
      <price>150000</price>
    </boat>
  </boats>
}

return avg(
  for $boat in $boats/boats/boat
  where $boat/price < 100000
  return $boat/price
)
let$boats:=文档{
50000
80000
150000
}
返回平均值(
美元船/船/船中的美元船
其中,$船/价格<100000
退回$5船/价格
)

此查询返回所提供输入的预期值65000。

通过返回
$x
而不是计算平均值,很容易发现问题:您的第一个查询将
$x
声明为所有价格的序列(因此
$x
(在下面的示例文档中为50000、80000、150000)
)<因此,code>$x<100000是
(50000、80000、150000)<100000
,它以基于集合的方式进行计算,如果序列中的任何元素小于100000,则验证为
true
avg($x)
最后再次获取原始列表并计算其平均值

您的第三个查询是实现预期解决方案的良好起点(并正确过滤),但由于您计算每个奖金的平均奖金,而不是所有奖金的实际平均值,因此将失败

由于您没有提供示例输入,我定义了以下内容:

let $boats := document {
  <boats>
    <boat>
      <price>50000</price>
    </boat>
    <boat>
      <price>80000</price>
    </boat>
    <boat>
      <price>150000</price>
    </boat>
  </boats>
}

return avg(
  for $boat in $boats/boats/boat
  where $boat/price < 100000
  return $boat/price
)
let$boats:=文档{
50000
80000
150000
}
返回平均值(
美元船/船/船中的美元船
其中,$船/价格<100000
退回$5船/价格
)

此查询返回所提供输入的预期值65000。

对于此类查询,使用XQuery的XPath子集通常比使用FLWOR表达式更简单。只是

avg(doc("boats.xml")/boats/boat/price[. < 100000])
avg(doc(“boats.xml”)/boats/boat/price[.<100000])
或者我非常喜欢XPath3.1管道语法

doc("boats.xml")/boats/boat/price[. < 100000] => avg()
doc(“boots.xml”)/boots/boat/price[.<100000]=>avg()

对于这样的查询,使用XQuery的XPath子集通常比使用FLWOR表达式更简单。只是

avg(doc("boats.xml")/boats/boat/price[. < 100000])
avg(doc(“boats.xml”)/boats/boat/price[.<100000])
或者我非常喜欢XPath3.1管道语法

doc("boats.xml")/boats/boat/price[. < 100000] => avg()
doc(“boots.xml”)/boots/boat/price[.<100000]=>avg()

欢迎使用堆栈溢出。对于一个好的问题,通常要确保您描述的问题可以重现——特别是对于XQuery问题,这几乎总是包括您使用的确切示例输入。把它缩短到一个合理的长度,但一定要用这个问题的确切输入。然后,“不工作”永远不会形成一个好的问题描述:“计算所有船只奖品的平均值”在这种情况下会更好。最后,还包括错误的和预期的查询输出(对于您提供的小示例文档,只需手动计算即可)。欢迎使用堆栈溢出。对于一个好的问题,通常要确保您描述的问题可以重现——特别是对于XQuery问题,这几乎总是包括您使用的确切示例输入。把它缩短到一个合理的长度,但一定要用这个问题的确切输入。然后,“不工作”永远不会形成一个好的问题描述:“计算所有船只奖品的平均值”在这种情况下会更好。最后,还要包括错误的和预期的查询输出(对于您提供的小示例文档,只需手工计算即可)。