2017-11-01 3 views
0

가 나는 where 절과 avg(...) 기능을 사용하려고 작동하지 않습니다,하지만 작동하지 않는 경우와 평균 계산 :필터링

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

내가 작은 모든 배의 평균을 찾기 위해 노력하고있다 100,000보다

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

이 코드는 모든 보트에서 작동합니다. 첫 번째 보트가 100k 미만의 보트에서 작동하지 않는 이유는 무엇입니까?

이것은 작동하지 않습니다. 대신 100,000에서 나에게 가격 목록을 제공 :

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

에 오신 것을 환영합니다있다. 좋은 질문을 위해 일반적으로 XQuery 질문과 같이 문제가 재현 될 수 있는지 확인하십시오.이 질문은 사용자가 사용하는 정확한 예제 입력을 포함합니다. 합리적인 길이로 줄이십시오. 그러나이 질문에 대한 정확한 입력으로 작업하십시오. 그런 다음 "작동하지 않음"은 좋은 문제 설명을 형성합니다. "모든 보트 상금의 평균 계산"이이 경우 훨씬 더 좋습니다. 마지막으로, 쿼리의 잘못된 출력과 기대되는 출력도 포함시킵니다 (제공 한 작은 예제 문서에서는 손으로 계산합니다). –

답변

4

문제가 쉽게 $x을 반환하는 대신의 평균을 계산에 의해 밝혀 : 첫 번째 쿼리가 모든 가격의 순서로 $x 선언 (그래서 $x에서 (50000, 80000, 150000) 내 예제 문서). 따라서 $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 
) 

이 쿼리는 기대 제공 입력 65000을 반환

당신이 예 입력을 제공하지 않았다으로

, 나는 다음과 같은 정의했다.

0

이와 같은 쿼리의 경우 FLWOR 식을 사용하는 대신 XQuery의 XPath 하위 집합을 사용하는 것이 더 간단합니다. 그것은 그냥

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

아니면 아주 스택 오버플로는 XPath 3.1 파이프 구문

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