5

I want to use Group By in xquery. Can someone tell me please how to use Group By in Marklogic ?

2

4 Answers 4

4

Alternatively, you could call out to XSLT using xdmp:xslt-invoke or xdmp:xslt-eval. MarkLogic's XSLT processor supports XSLT 2.0, which includes full support for <xsl:for-each-group>.

0
4

The short answer is to use map:map. See http://docs.marklogic.com/map:map for documentation, and http://blakeley.com/blogofile/archives/560/ for a longer discussion.

1
xquery version "1.0-ml";
let $xml:= <Students>
    <Student Country="England" Name="Dan" Age="20" Class="C"/>
    <Student Country="England" Name="Maria" Age="20" Class="B" />
    <Student Country="Australia" Name="Mark" Age="22" Class="A" />
  </Students>

let $xsl:= <xsl:stylesheet version="2.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="Students">
  <result>
    <xsl:for-each-group select="Student" group-by="@Country">
    <country>
      <xsl:attribute name="name"><xsl:value-of select="fn:current-grouping-key()"/></xsl:attribute>
      <xsl:for-each select="fn:current-group()/@Name">
        <name><xsl:value-of select="."/></name>     
      </xsl:for-each>
    </country>
    </xsl:for-each-group>
  </result>
</xsl:template>
</xsl:stylesheet>

return xdmp:xslt-eval($xsl,$xml)
0

MarkLogic covers parts of XQuery 3.0 (with its 1.0-ml dialect), but unfortunately FLWOR group by support is lacking.

However, you can still programmatically create group by like syntax which will achieve the same results. Here is an XQuery example:

for $d in distinct-values(doc("order.xml")//item/@dept)
let $items := doc("order.xml")//item[@dept = $d]
order by $d
return <department code="{$d}">{
         for $i in $items
         order by $i/@num
         return $i
       }</department>

HTH

2
  • 1
    MarkLogic 5 doesn't support group by.
    – wst
    Commented May 23, 2013 at 22:04
  • 1
    You could speed up this approach using cts:values (instead of distinct-values), and cts:search (instead of XPath predicates), particularly if you can store order items as separate files.
    – grtjn
    Commented Dec 15, 2016 at 8:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.