2016-04-03 1 views
1

У меня есть документ XML, который выглядит как:Xquery - поиск минимального атрибута для каждой группы.

<charities> 
    <charity char_id="x211x"> 
     <donor type="other" amount="300" /> 
     <donor type="corporation" amount="250" /> 
     <donor type="individual" amount="50" /> 
    </charity> 
    <charity char_id="x202x"> 
     <donor type"other" amount="25" /> 
     <donor type="individual" amount="25" /> 
     <donor type="corporation" amount="500" /> 
    </charity> 
</charities> 

Я хочу, чтобы иметь возможность использовать XQuery вернуть минимальное пожертвование для каждой благотворительной организации, с удостоверением, что благотворительность и сумму, которая была подарена. Там, где существуют связи для минимума, оба сообщили

Так что результат будет, в этом случае выглядит следующим образом:

<minDonors> 
    <charity char_id="x211x"> 
     <donation amount="50">individual</donation> 
    </charity> 
    <charity char_id="x202x"> 
     <donation amount="25">other</donation> 
     <donation amount="25">individual</donation> 
    </charity> 
</minDonors> 

До сих пор я мог получить только с беспорядком использования функции мин, но я просто сравните значение с самим собой.

ответ

1

Использование min(...):

<minDonors>{ 
    for $charity in //charity 
    let $min-donation := min($charity/donor/@amount/number()) 
    return <charity>{ 
    $charity/@char_id, 
    for $donor in $charity/donor[@amount = $min-donation] 
    return <donation amount="{$donor/@amount}">{ 
     $donor/@type/string() 
    }</donation> 
    }</charity> 
}</minDonors> 

Использование XQuery 3 count вместе с order by (скорее всего, менее эффективен):

<minDonors>{ 
    for $charity in //charity 
    return <charity>{ 
    $charity/@char_id, 
    for $donor in $charity/donor 
    group by $amount := $donor/@amount 
    order by xs:double($amount) 
    count $c 
    where $c = 1 
    for $donation in $donor 
    return <donation amount="{$amount}">{ 
     $donation/@type/string() 
    }</donation> 
    }</charity> 
}</minDonors> 
Смежные вопросы