2017-02-24 9 views
0

同じノードの属性を比較してカウントする際に問題が発生しました。たとえば、同じ日に複数回操作した医師をフィルタリングする必要があります。私の例のxmlはこれです:同じノードの属性を比較する方法

<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> 

私は同じ日に2つの操作を行った唯一の "David"だけを表示する必要があります。私は

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では、このようなことをやりやすくする「グループ化」演算子が導入されました。 –

+0

3.0。私はいくつかのことを試みましたが、まだxqueryで始まっています –

答えて

1

あり、この問題を解決するために複数の方法がありますが、1つの簡単な解決策は終わった後、医師名の別個の値をループにループですその医師の日付の明確な値を計算し、一致するものを数え、それらをシーケンスに格納し、最後にwhereを使用して結果セットを、そのシーケンスの値が1より大きい医者に限定する。 XQueryの3.0、使用の際に

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

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

このオプションもありがとう –

関連する問題