[xquery-talk] Xquery : Sort and get only the first record
sudheshna iyer
sudheshnaiyer at yahoo.com
Sun Nov 15 00:11:50 PST 2015
Thank you all for the reply.
Just need one more modification to this. In the input if the StartDate is blank, then I should consider that as the current job and return the job that has blank as the output.
If there are no jobs which have startDate as blank, then it should return the recent startdate job (for which we already have the response as shown in email chain,,)
For eg, in the below case, response should be the job element with id = 1: <?xml version="1.0" encoding="UTF-8"?><Request> <SessionInfo> <uid>qq</uid> <pwd>qq</pwd> </SessionInfo> <Param> <CustomerInfo> <Contact> <Number>123</Number> <Name>aaa bbb</Name> <Jobs> <job> <Name>Analyst</Name> <Id>1</Id> <StartDate></StartDate> <EndDate>1</EndDate> </job> <job> <Name>Programmer</Name> <Id>2</Id> <StartDate>08-31-2015</StartDate> <EndDate>2</EndDate> </job> </Jobs> </Contact> </CustomerInfo> </Param></Request>
From: Ghislain Fourny <g at 28.io>
To: Ronald Bourret <rpbourret at rpbourret.com>
Cc: "talk at x-query.com" <talk at x-query.com>; sudheshna iyer <sudheshnaiyer at yahoo.com>
Sent: Tuesday, November 3, 2015 4:51 AM
Subject: Re: [xquery-talk] Xquery : Sort and get only the first record
Hi Ronald,
You can also use a count clause if you have XQuery 3.0! It makes it easier to read. Like so:
for $job in doc('x.xml')//job
order by xs:date(replace($job/StartDate, "(\d{2})-(\d{2})-(\d{4})", "$3-$1-$2")) descending
count $position
where $position eq 1
return $job
I hope it helps.
Kind regards,Ghislain
On Mon, Nov 2, 2015 at 6:27 PM, Ronald Bourret <rpbourret at rpbourret.com> wrote:
Can't use just use a predicate that returns the first element in the sorted sequence? Something like:
let $seq = for $job in doc('x.xml')//job
order by
xs:date(replace($job/StartDate,
"(\d{2})-(\d{2})-(\d{4})", "$3-$1-$2")
) descending
return $job
return $seq[1]
(My apologies if the syntax isn't exact. I haven't written an XQuery for quite a while.)
-- Ron
On 11/2/2015 5:53 AM, sudheshna iyer wrote:
Thank you very much, Christian. Let me try this..
------------------------------------------------------------------------
*From:* Christian Grün <christian.gruen at gmail.com>
*To:* sudheshna iyer <sudheshnaiyer at yahoo.com>
*Cc:* "talk at x-query.com" <talk at x-query.com>
*Sent:* Sunday, November 1, 2015 4:26 PM
*Subject:* Re: [xquery-talk] Xquery : Sort and get only the first record
If your XQuery processor supports XQuery Update, this would be one solution:
copy $xml := doc('x.xml')
modify (
delete node subsequence(
for $job in $xml//job
order by xs:date(replace($job/StartDate,
"(\d{2})-(\d{2})-(\d{4})", "$3-$1-$2")
) descending
return $job
, 2)
)
return $xml
Best,
Christian
On Sun, Nov 1, 2015 at 8:51 PM, sudheshna iyer <sudheshnaiyer at yahoo.com
<mailto:sudheshnaiyer at yahoo.com>> wrote:
> Team,
>
> I have an xml which has multiple jobs elements. I want to sort the
jobs and
> want to output only the latest job. Note that <EndDate> can be empty
> indicating that it is the current job.
>
> Basically I want to order by jobs/job/EndDate in descending fashion and
> select only the first record..
>
> How do I do that using xquery?
>
> Input request:
> <?xml version="1.0" encoding="UTF-8"?>
> <Request>
> <SessionInfo>
> <uid>qq</uid>
> <pwd>qq</pwd>
> </SessionInfo>
> <Param>
> <CustomerInfo>
> <Contact>
> <Number>123</Number>
> <Name>aaa bbb</Name>
> <Jobs>
> <job>
> <Name>Analyst</Name>
> <Id>1</Id>
> <StartDate>01-01-2015</StartDate>
> <EndDate>08-30-2015</EndDate>
> </job>
> <job>
> <Name>Programmer</Name>
> <Id>2</Id>
> <StartDate>08-31-2015</StartDate>
> <EndDate />
> </job>
> </Jobs>
> </Contact>
> </CustomerInfo>
> </Param>
> </Request>
>
> Expected output:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <Request>
> <SessionInfo>
> <uid>qq</uid>
> <pwd>qq</pwd>
> </SessionInfo>
> <Param>
> <CustomerInfo>
> <Contact>
> <Number>123</Number>
> <Name>aaa bbb</Name>
> <Jobs>
> <job>
> <Name>Programmer</Name>
> <Id>2</Id>
> <StartDate>08-31-2015</StartDate>
> <EndDate/>
> </job>
> </Jobs>
> </Contact>
> </CustomerInfo>
> </Param>
> </Request>
>
> Your help is greatly appreciated.
>
>
>
>
> _______________________________________________
> talk at x-query.com <mailto:talk at x-query.com>
> http://x-query.com/mailman/listinfo/talk
_______________________________________________
talk at x-query.com
http://x-query.com/mailman/listinfo/talk
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
_______________________________________________
talk at x-query.com
http://x-query.com/mailman/listinfo/talk
_______________________________________________
talk at x-query.com
http://x-query.com/mailman/listinfo/talk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://x-query.com/pipermail/talk/attachments/20151115/3d4c8f06/attachment.html>
More information about the talk
mailing list