我遇到了一个问题,试图比较和计算同一节点的属性,例如,我需要过滤那天多次操作一次以上的医生。我的示例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>
我只需要展示"大卫"是唯一在同一天进行两项操作的人。我得到了这个糟糕的查询
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
提前感谢,对不起,我的英语
有多种解决这个问题的方法,但是一个直接的解决方案是循环循环医生名称的不同值,然后循环循环,绕过该医生的不同日期值,计数那些匹配的日期并将它们存储为序列,然后最终将使用where
的结果集约束至仅在该序列中具有值大于一个序列的医生。
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
在xquery 3.0中,使用:
for $o in //med_operation
group by $doc := $o/@doctor, $date := $o/@date
where count($o) gt 1
return $doc