2016-03-23 5 views
1

Я использую BaseX, который поддерживает XQuery 3.0.Есть ли эквивалент CONNECT BY PRIOR в XQuery?

Скажем, у меня есть набор данных, как это, упорядоченный по стоимости <start>:

<element> 
<start>1</start> 
<end>2</end> 
</element> 
<element> 
<start>2</start> 
<end>4</end> 
</element> 
<element> 
<start>5</start> 
<end>6</end> 
</element> 

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

<block> 
    <start>1</start> 
    <end>4</end> 
</block> 
<block> 
    <start>5</start> 
    <end>6</end> 
</block> 

В Oracle мы могли бы сделать что-то подобное с помощью CONNECT BY PRIOR. Как мы можем это сделать в XQuery?

+0

ли у вас уже есть взгляд на XQuery 3.0 [Окно пункта] (http://docs.basex.org/wiki/XQuery_3.0#window)? –

+0

@ ChristianGrün, нет, я этого не делал. Спасибо за подсказку, я посмотрю на это. – wvdz

ответ

2

Вы можете реализовать это поведение, используя окно поворота, которое позволяет группировать на основе условий по элементам. Для раздвижных и поворотных окон требуется XQuery 3.0, который поддерживается BaseX.

let $items := (
    <element> 
    <start>1</start> 
    <end>2</end> 
    </element>, 
    <element> 
    <start>2</start> 
    <end>4</end> 
    </element>, 
    <element> 
    <start>5</start> 
    <end>6</end> 
    </element> 
) 
for tumbling window $window in $items 
    start $start when fn:true() 
    only end $end next $next when not(
    $end/end eq $next/start 
) 
return <block>{ 
    $start/start, 
    $end/end 
}</block> 
+0

Это прекрасно. Еще раз спасибо. – wvdz

+0

Просто небольшое дополнение ... Это также работает: 'start $ start, когда fn: true() end $ end, когда $ start/end eq $ end/start' –