我有很多订单如下:
<order id="1">
<TargetPrice>100</TargetPrice>
<Qty>2</Qty>
</order>
我需要一个Xquery来获取具有最高值的订单(其中value是TargetPrice * Qty)
我该怎么做?
答案 0 :(得分:3)
按降序对订单排序,并返回第一个元素。
(
for $order in //order
let $value := $order/TargetPrice * $order/Qty
order by $value descending
return $order
)[1]
答案 1 :(得分:2)
您可能希望在函数和运算符3.1规范的D.6.1中实现该函数。这有点比#34;排序更长,并采取第一个&#34;解决方案,但它可能更快(原则上它是可流动的),并且代码是高度可重用的。
D.6.1例如:最高
函数eg:highest返回具有所提供函数的最高值的项目。
XSLT实施
(剪断)
XQuery实现
declare function eg:highest(
$seq as item()*
$f as function(item()) as xs:anyAtomicType)
as item()* {
fn:fold-left(
fn:tail($seq), fn:head($seq),
function($highestSoFar as item()*, $this as item()*) as item()* {
let $thisValue := $f($this)
let $highestValue := $f($highestSoFar[1])
return
if ($thisValue gt $highestValue)
then $this
else if ($thisValue eq $highestValue)
then ($highestSoFar, $this)
else $highestSoFar
})
};
要查找薪水最高的员工,可以将该职能称为:
eg:highest(//employee, function($emp){$emp/salary})
答案 2 :(得分:1)
另一种选择是使用simple map operator !
并为项目序列计算TargetPrice * Qty
的乘积,然后选择max()
值,并在谓词中使用:
let $maxVal := max(//order ! (TargetPrice * Qty))
return //order[(TargetPrice * Qty) eq $maxVal]