2017-02-24 58 views
0

我在嘗試比較和統計同一節點的屬性時出現問題,例如,我需要過濾在同一天操作多次的醫生。我的例子xml是這樣的:如何比較同一節點上的屬性xQuery

<ops> 
    <med_operation pac="p1" doctor="David" date="2017-01-01" /> 
    <med_operation pac="p2" doctor="David" date="2017-01-01" /> 
    <med_operation pac="p3" doctor="Ana" date="2017-01-02" /> 
</ops> 

我只會顯示「大衛」是唯一一個在同一天完成兩個操作的人。我得到了這個可憐的查詢提前

let $m := distinct-values(
    let $dates := //med_operation/@date 
    for $d in $dates 
    let $ope := //med_operation[@date=$d] 
    let $c := count(//med_operation[@date=$d]) 
    for $y in (1 to $c) 
    where ($ope[$y]/@date) = ($ope[$y+1]/@date) and $c > 1 
    return distinct-values($ope/@doctor) 
    ) 
return $m 

感謝和我的英語對不起

+0

這是的XQuery 1.0或3.0/3.1? XQuery 3.0引入了「group by」操作符,這使得這種事情變得更加容易。 –

+0

3.0。我曾嘗試過幾件事,但我仍然從xquery開始 –

回答

1

有多種方式來解決這個問題,但是一個簡單的解決方案在中循環,在醫生的名字不同的值,然後循環爲該醫生設定不同的日期值,計算匹配的值並將它們存儲在一個序列中,然後最後使用where將結果集約束僅限於那些序列值大於1的醫生。

for $doc in distinct-values(//med_operation/@doctor) 
let $date-counts := 
    for $date in distinct-values(//med_operation[@doctor = $doc]/@date) 
    return count(//med_operation[@doctor = $doc][@date= $date]) 
where ($date-counts[. gt 1]) 
return $doc 
+0

您的選擇完美無缺,謝謝! –

1

在XQuery中3.0,使用:

for $o in //med_operation 
group by $doc := $o/@doctor, $date := $o/@date 
where count($o) gt 1 
return $doc 
+0

也感謝這個選項 –