2015-10-28 4 views
0

У меня есть четыре значения, которые будут меняться. Я хочу получить строку из них, содержащую два самых больших из этих значений ("v1, v2"). Они могут быть в последовательности или самостоятельно. Мне все равно. Я пробовал несколько разных способов, но я не эксперт в этом, и я просто не могу понять. Я понял, как получить максимальное значение в последовательности, используя функцию max(), но мне также нужен второй по величине.XQuery найти два самых больших значения

+0

Этот вопрос будет значительно улучшено, если вы показали, что выглядит ваши данные как. Это сырая последовательность? Ряд элементов, из которых вы извлекаете значения? Что-то другое? –

+0

В любом случае - подумайте об этом на минуту. Вам нужен макс, который вы уже знаете, как это сделать, тогда вы хотите * самое большое значение, которое не является максимальным *. –

+0

Что вы хотите сделать, если ваша последовательность выглядит как '1,2,4,4'? Возвратите '4' дважды, или' 2' и '4' отдельно? –

ответ

0

Ниже приведено право, за исключением случаев, когда оно не касается случаев, когда максимальное значение дублируется (и поэтому должно быть возвращено для обоих значений).

declare variable $seq := (2,4,3,1); (: define the input sequence :) 
max($seq), max($seq[. != max($seq)]) (: evaluate to maximum and max of values not equal 
             to the global maximum :) 

Если вы хотите, чтобы справиться с другим случаем, а также, один из способов были бы таким образом:

(: from http://www.xqueryfunctions.com/xq/functx_sort-as-numeric.html :) 
declare function local:sort-as-numeric 
    ($seq as item()*) as item()* { 

    for $item in $seq 
    order by number($item) 
    return $item 
}; 

(: define the input sequence :) 
declare variable $seq := (2,4,3,1); 

(: sort the sequence, then take the last and second-to-last values :) 
local:sort-as-numeric($seq)[position()=(last()-1, last())] 

... очевидно, что если вы хотите нечисловой вид, изменить order by number($item) к order by $item ,

+0

Вот и все. Спасибо, Чарльз! Просто нужно 'max ($ seq [.! = Max ($ seq)])'. Прекрасно работает. Еще раз спасибо! – austinminn

1

Вот общий способ получить максимальное количество N из последовательности.

declare function local:max-N(
    $seq as item()*, 
    $N as xs:int 
) as item()* 
{ 
    if ($N gt 0) 
    then 
    let $max := max($seq)[1] 
    return ($max, local:max-N($seq[. ne $max], $N - 1)) 
    else() 
}; 

Например, чтобы решить эту проблему, вы можете описать:

local:max-N(
    (111, 22, 333, 4, 55, 66, 7, 88), 
    2) 
=> (333, 111) 
Смежные вопросы