(此问题已编辑。)
尊敬的社区:
我在XQuery方面经验不是很丰富,目前在处理CDISC xml文档时遇到了以下问题。我已经在这个特定的查询上花了相当长的时间,我知道当我最终得到正确的答案时,我会很兴奋的。
我正在使用xquery version "3.0";
我在一个文档中有几条记录,如下所示。
<ItemGroupData ItemGroupOID="DM" data:ItemGroupDataSeq="1">
<ItemData ItemOID="DM.USUBJID" Value="01-701-1015"/>
<ItemData ItemOID="DM.RFXSTDTC" Value="2014-01-02"/>
</ItemGroupData>
<ItemGroupData ItemGroupOID="DM" data:ItemGroupDataSeq="2">
<ItemData ItemOID="DM.USUBJID" Value="01-701-1023"/>
<ItemData ItemOID="DM.RFXSTDTC" Value="2014-02-02"/>
</ItemGroupData>
和另一个文档,其中有几条这样的记录:
<ItemGroupData ItemGroupOID="EX" data:ItemGroupDataSeq="1" >
<ItemData ItemOID="EX.USUBJID" Value="01-701-1015"/>
<ItemData ItemOID="EX.EXSEQ" Value="1"/>
<ItemData ItemOID="EX.EXSTDTC" Value="2014-06-19"/>
<ItemData ItemOID="EX.EXENDTC" Value="2014-06-21"/>
</ItemGroupData>
<ItemGroupData ItemGroupOID="EX" data:ItemGroupDataSeq="2" >
<ItemData ItemOID="EX.USUBJID" Value="01-701-1015"/>
<ItemData ItemOID="EX.EXSEQ" Value="2"/>
<ItemData ItemOID="EX.EXSTDTC" Value="2014-06-19"/>
<ItemData ItemOID="EX.EXENDTC" Value="2014-06-27"/>
</ItemGroupData>
<ItemGroupData ItemGroupOID="EX" data:ItemGroupDataSeq="3" >
<ItemData ItemOID="EX.USUBJID" Value="01-701-1015"/>
<ItemData ItemOID="EX.EXSEQ" Value="3"/>
<ItemData ItemOID="EX.EXSTDTC" Value="2014-06-19"/>
<ItemData ItemOID="EX.EXENDTC" Value="2014-07-02"/>
</ItemGroupData>
<ItemGroupData ItemGroupOID="EX" data:ItemGroupDataSeq="4" >
<ItemData ItemOID="EX.USUBJID" Value="01-701-1023"/>
<ItemData ItemOID="EX.EXSEQ" Value="1"/>
<ItemData ItemOID="EX.EXSTDTC" Value="2014-06-19"/>
<ItemData ItemOID="EX.EXENDTC" Value="2014-07-02"/>
</ItemGroupData>
<ItemGroupData ItemGroupOID="EX" data:ItemGroupDataSeq="5" >
<ItemData ItemOID="EX.USUBJID" Value="01-701-1023"/>
<ItemData ItemOID="EX.EXSEQ" Value="2"/>
<ItemData ItemOID="EX.EXSTDTC" Value="2014-06-19"/>
<ItemData ItemOID="EX.EXENDTC" Value=""/>
</ItemGroupData>
我想检查最后一个EXSTDTC
(带有EX
数据集的max(EXSEQ)
)是否等于相应的(具有相同USUBJID
的唯一ID
) RFXSTDTC
。
假设EXENDTC
是null
,那么RFXSTDTC
应该等于最后一个EXSTDTC
(但如果我只知道如何检查EXENDTC
,我可能可以自己解决这个问题)
我还是不知道怎么写,如果你们中有人能教我怎么写,我会很高兴的。
再次,我希望我足够精确,并希望您能帮助我,提前谢谢!
回应第一条评论:非常感谢你的帮助!你是对的,不同的值非常耗时,因为我的数据集包含大约300条记录(实际上,我只测试了前10条记录-已经花了6秒)。分组方式似乎是正确的方法!
更新(12/05/2015)
我试着用下面的方法来解决我的问题,但是我在返回表达式中没有得到exendtcvalue的值。为了通用起见,我使用从另一个元数据xml文档中检索到的$oids。
for $record in doc($dmdatasetlocation)//odm:ItemGroupData[@data:ItemGroupDataSeq < 5][odm:ItemData[@ItemOID=$usubjidoid]]
let $recnum := $record/@data:ItemGroupDataSeq
let $dmusubjidvalue := $record/odm:ItemData[@ItemOID=$usubjidoid]/@Value
let $rfxendtcvalue := $record/odm:ItemData[@ItemOID=$rfxendtcoid]/@Value
let $exendtcvalue := (
for $a in doc($exdatasetlocation)//odm:ItemGroupData[odm:ItemData[@ItemOID=$exusubjidoid and @Value=$dmusubjidvalue]]
let $maxseqvalue := functx:max-string(doc($exdatasetlocation)//ItemGroupData[odm:ItemData[@IItemOID=$exusubjidoid and @Value=$dmusubjidvalue]][odm:ItemData[@ItemOID=$exseqoid]]/@Value)
where $a = doc($exdatasetlocation)//odm:ItemGroupData[odm:ItemData[@ItemOID=$exusubjidoid and @Value=$dmusubjidvalue]][odm:ItemData[@ItemOID=$exseqoid and @Value=$maxseqvalue]][odm:ItemData[@ItemOID=$exendtcoid]]/@Value
return $a
)
where not($exendtcvalue=$rfxendtcvalue)
(: ((functx:if-empty($exendtcvalue, 0)) and :)
(: or (functx:if-empty($exendtcvalue, 0) and ($rfxendtcvalue=$exstdtcvalue)) :)
return <warning rule="SPC_DM_RFXENDTC_01" rulelastupdate="2015-02-11" recordnumber="{data($recnum)}">RFXENDTC, value={data($rfxendtcvalue)} in dataset {data($dmdatasetname)} is not an allowed value, it should be the same as the last EX.EXENDTC value ={data($exendtcvalue)} </warning>
谢谢你的帮助!克里斯蒂安
发布于 2015-04-30 16:22:02
您没有指定您的XQuery处理器是支持3.0还是仅支持1.0 -在3.0中您可以使用group by
,这在这里会特别方便。但是,在使用distinct-values
的任一版本中都可以实现相同的结果
let $subject-ids := fn:distinct-values(//ItemGroupData/ItemData[@ItemOID="subject_ID"]/@Value)
for $id in $subject-ids
let $grouped := //ItemGroupData[ItemData[@ItemOID="subject_ID" and @Value=$id]]
let $max := fn:max($grouped/ItemData[@ItemOID="Sequence"]/@Value)
return $grouped[ItemData[@ItemOID="Sequence" and @Value=$max]]
对于大型数据集,distinct-values
的性能并不好。根据您的XQuery处理器的不同,您可能会使用特定于实现的优化来提高性能,或者在许多情况下只使用group by
。
https://stackoverflow.com/questions/29972521
复制