2017-11-01 10 views
0

は私がwhere句でavg(...)機能を使用しようとしています動作しませんが、動作していないところで平均計算:フィルタリング

let $x := doc("boats.xml")/boats/boat/price 
      where $x < 100000 
      return avg($x) 

は私が小さいすべての船の平均を見つけようとしています100k

let $x := doc("boats.xml")/boats/boat/price 
      return avg($x) 

このコードはすべてのボートに適用されます。最初の船が100k未満のボートで働くのはなぜですか?

これは機能しません。それは代わりに、100Kの下で私に価格のリストを与える:

for $x in doc("boats.xml")/boats/boat 
        where $x/price<100000 
        return avg($x/price) 
+1

ようこそ同様。良い質問のためには、一般的には、あなたが記述した問題を再現できることを確認してください。特にXQueryの質問の場合は、これがかなり正確です。合理的な長さにカットしますが、質問のためにこの正確な入力で作業してください。それから、「うまくいかない」_never_は良い問題の記述をします。この場合、「すべてのボート賞の平均を計算する」方がはるかに良いでしょう。最後に、クエリの間違った出力と予想される出力も含めます(入力した小さなサンプルドキュメントの場合は手作業で計算します)。 –

答えて

4

問題が簡単に$xを返す代わりに、平均値を算出することにより、明らかにされています。あなたの最初のクエリは、すべての価格のシーケンスとして$xを宣言します(そう$x(50000, 80000, 150000)である私以下の例のドキュメントを参照してください)。 $x < 100000(50000, 80000, 150000) < 100000であり、セットベースの方法で評価し、のいずれかがの要素が100000より小さい場合、trueに検証します。 avg($x)は最終的に元のリストを再度取り、これに対する平均を計算します。

あなたの3番目のクエリは、期待される解決策(そして適切にフィルタリング)を開始するのに適していますが、実際の平均値ではなく各賞の平均賞を計算すると失敗します。

あなたは例の入力を提供しなかったとして、私は次のように定義:

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 
) 

をこのクエリは、提供された入力に対して想定し65000を返します。

0

このようなクエリでは、FLWOR式を使用するのではなく、XQueryのXPathサブセットを使用する方が簡単です。それはちょうど

avg(doc("boats.xml")/boats/boat/price[. < 100000]) 

または私はかなりのスタックオーバーフロー上のXPath 3.1のパイプ構文

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