如何在XQuery 1.0中获得没有group by的最常见元素?

时间:2016-01-23 20:38:54

标签: xml xquery

我想从列表中提取最常用的元素。

列表$listOut由此类元素组成:

<Outcome>
  <Parameter>B</Parameter>
  <Value>15</Value>
  <MinVal>1</MinVal>
  <MaxVal>20</MaxVal>
</Outcome>
<Outcome>
  <Parameter>A</Parameter>
  <Value>15</Value>
  <MinVal>1</MinVal>
  <MaxVal>20</MaxVal>
</Outcome>
<Outcome>
  <Parameter>D</Parameter>
  <Value>43</Value>
  <MinVal>34</MinVal>
  <MaxVal>36</MaxVal>
</Outcome>
<Outcome>
  <Parameter>B</Parameter>
  <Value>4</Value>
  <MinVal>1</MinVal>
  <MaxVal>20</MaxVal>
</Outcome>

我想要获得的是<Parameter>B</Parameter>,因为参数B存在2次,因此它是最常见的。

我不知道如何执行此操作我无法使用group by语句。 (仅限For,Let,Order By,Where,Return)

我想过做这样的事情:

for $outOk in distinct-values( $listOut )
let $paramOk := //Outcome[Parameter eq $outOk]
order by count( //Outcome[Parameter eq $outOk] )
return $paramOk

但它自然不起作用。

1 个答案:

答案 0 :(得分:5)

不同的值只能在atomar值上确定,而不能在整个子树上确定。相反,查询参数的不同值,然后计算与此参数匹配的元素,按参数出现次序排序,最后限制为单个结果。

let $listOut := (
  <Outcome>
    <Parameter>B</Parameter>
    <Value>15</Value>
    <MinVal>1</MinVal>
    <MaxVal>20</MaxVal>
  </Outcome>,
  <Outcome>
    <Parameter>A</Parameter>
    <Value>15</Value>
    <MinVal>1</MinVal>
    <MaxVal>20</MaxVal>
  </Outcome>,
  <Outcome>
    <Parameter>D</Parameter>
    <Value>43</Value>
    <MinVal>34</MinVal>
    <MaxVal>36</MaxVal>
  </Outcome>,
  <Outcome>
    <Parameter>B</Parameter>
    <Value>4</Value>
    <MinVal>1</MinVal>
    <MaxVal>20</MaxVal>
  </Outcome>
)
return
  (
    (: loop over the set of distinct parameter values :)
    for $parameter in distinct-values( $listOut/Parameter )
    (: for each of them, count its occurences :)
    let $occurences := count($listOut[Parameter eq $parameter])
    (: order the result set by the occurence count in descending order :)
    order by $occurences descending
    return $parameter
  (: limit to the first result, which is the parameter value occuring most :)
  )[1]