2013-02-14 125 views
0

我的XML文档,如下所示:XQuery的分组,并找到最大值

<books> 
    <book><author>A</author></book> 
    <book><author>B</author></book> 
    <book><author>C</author></book> 
    <book><author>B</author></book> 
    <book><author>C</author></book> 
</books> 

现在,查询应与大多数书籍返回作者的姓名。在这种情况下B,C(因为两者具有2本书)。的问题是,它必须是只有一个查询,所以找到最大(2),然后用2本书籍搜索作者是不是在这种情况下是可接受的解决方案。

回答

2

集团由作者和他们的出版物的数量一起存储的直接结果。然后筛选以仅返回发布计数最大的作者。

let $authors := 
    for $book in //book 
    let $author := $book/author 
    group by $author 
    return <author count="{ count($book) }">{ $author }</author> 
return $authors[@count = max($authors/@count)]/data() 
+0

这正是OP说他不想要的,因为它有2次通过,尽管我认为这根本不可能。 – wst 2013-02-14 21:11:47

+0

这是一个单一的查询。在不存储中间结果的情况下,这是不可能的,因为你必须在过滤之前找出最大值。另一种方法是排序'$ authors'并与第一结果进行对照,但可能有更好的优化潜力,但在两端也打破了执行流水线。 – 2013-02-14 21:15:58

+0

我同意你的看法,但这种调用一个查询是舒展。我想在OP的原始问题中,他说他不想要2次传球。如果你想要这种查询,它需要一个带有频率数据的索引。 – wst 2013-02-15 00:27:08