首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >eXist-db中的XQuery获取记录中每个主题的最后一项并进行比较-我如何在这里使用group-by?

eXist-db中的XQuery获取记录中每个主题的最后一项并进行比较-我如何在这里使用group-by?
EN

Stack Overflow用户
提问于 2015-04-30 16:00:28
回答 1查看 94关注 0票数 0

(此问题已编辑。)

尊敬的社区:

我在XQuery方面经验不是很丰富,目前在处理CDISC xml文档时遇到了以下问题。我已经在这个特定的查询上花了相当长的时间,我知道当我最终得到正确的答案时,我会很兴奋的。

我正在使用xquery version "3.0";

我在一个文档中有几条记录,如下所示。

代码语言:javascript
运行
AI代码解释
复制
<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>

和另一个文档,其中有几条这样的记录:

代码语言:javascript
运行
AI代码解释
复制
    <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

假设EXENDTCnull,那么RFXSTDTC应该等于最后一个EXSTDTC (但如果我只知道如何检查EXENDTC,我可能可以自己解决这个问题)

我还是不知道怎么写,如果你们中有人能教我怎么写,我会很高兴的。

再次,我希望我足够精确,并希望您能帮助我,提前谢谢!

回应第一条评论:非常感谢你的帮助!你是对的,不同的值非常耗时,因为我的数据集包含大约300条记录(实际上,我只测试了前10条记录-已经花了6秒)。分组方式似乎是正确的方法!

更新(12/05/2015)

我试着用下面的方法来解决我的问题,但是我在返回表达式中没有得到exendtcvalue的值。为了通用起见,我使用从另一个元数据xml文档中检索到的$oids。

代码语言:javascript
运行
AI代码解释
复制
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>

谢谢你的帮助!克里斯蒂安

EN

回答 1

Stack Overflow用户

发布于 2015-04-30 16:22:02

您没有指定您的XQuery处理器是支持3.0还是仅支持1.0 -在3.0中您可以使用group by,这在这里会特别方便。但是,在使用distinct-values的任一版本中都可以实现相同的结果

代码语言:javascript
运行
AI代码解释
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29972521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档