2013-02-14 110 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

相關問題