如何在Xquery中使用group by函数

时间:2017-07-07 12:02:34

标签: xquery marklogic

我正在使用XQuery,我需要在Xquery中转换(,)sepereated格式或使用group by。

Final Output
grp|A|#A
grp|A4|#A
grp|A2|#A
grp|A1|#A


Expected Output

grp|A,A4,A2,A1|#A

我的Xquery:

let $root := 'grp'
let $uri := for $i in fn:collection('collection')
 return fn:document-uri($i)
let $result := for $each-uri in $uri

             let $title := (doc($each-uri)//grp/title/text())[1] 
             let $id  := (doc($each-uri)//grp/@id)[1]
             let $root :=  'grp'
             return fn:concat($root,'|',$id,'|',$title)

         return fn:distinct-values($result)

1 个答案:

答案 0 :(得分:1)

我认为只缺少分组和string-join来电。

let $root := 'grp'
let $uri := for $i in fn:collection('collection')
            return fn:document-uri($i)
let $result := for $each-uri in $uri
               let $title := (doc($each-uri)//grp/title/text())[1] 
               let $id  := (doc($each-uri)//grp/@id)[1]
               let $root :=  'grp'
               group by $root, $title
               return fn:concat($root,'|',string-join($id, ","),'|',$title)
return fn:distinct-values($result)

虽然可能需要将distinct-values移动到ID,concat也可以替换为string-join,如下所示:

let $root := 'grp'
let $uri := for $i in fn:collection('collection')
            return fn:document-uri($i)
let $result := for $each-uri in $uri
               let $title := (doc($each-uri)//grp/title/text())[1] 
               let $id  := (doc($each-uri)//grp/@id)[1]
               let $root :=  'grp'
               group by $root, $title
               return string-join(
                 ($root, string-join(distinct-values($id), ","), $title),
                 '|'
               )
return $result