2016-01-23 45 views
3

我想从列表中提取最频繁的元素。如何在XQuery 1.0中获得没有分组的最频繁元素?

名单$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 $outOk in distinct-values($listOut) 
let $paramOk := //Outcome[Parameter eq $outOk] 
order by count(//Outcome[Parameter eq $outOk]) 
return $paramOk 

但它自然是行不通的。

+0

原样,你的问题是不完整的,因为它缺少非常重要的信息不能回答。包含单个元素的列表中最频繁的元素就是这个单个元素。请编辑您的问题以包含:合理的示例输入(多个元素,所以也有非最大元素),预期输出和解释您当前的代码有什么问题。 [如何发布SSCCE](http://sscce.org)提供了一个关于如何发布好问题的好教程。 –

+0

请发布一个包含多个元素的较大示例文档,您期望的结果是什么以及结果实际是什么。告诉我们为什么实际产出不符合您的预期。 – Matthew

+0

@JensErat我认为不需要更多的XML,只需** $ listOut **是元素列表**结果**。我添加了一些更多的代码,以更清晰 – Timmy

回答

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] 
+0

我想更好地了解您的解决方案做了什么,如果告诉我是什么,我认为可以确切的说:** **为:浏览所有的参数** **让:创造1元的与该出现次数列表参数在列表中** order by **:命令如何以降序模式打印初始参数** return **和[1]:仅打印for的第一个元素它是正确还是有更好的解释? – Timmy

+0

你的解释看起来不错。我在解释每一行的代码中添加了一些注释。一些注意事项:'for'行浏览_distinct values_参数。 'let'行确实创建了单个元素列表,但这是一个非常漂亮的XQuery实现细节,并且与此处不相关 - 您可以简单地将其视为此查询的单个数值。我认为你的其他解释是好的。 –

相关问题