SQL Server - объединить отдельные идентификаторы в диапазоне - PullRequest
2 голосов
/ 16 июня 2011

У меня есть таблица, которая содержит много целых чисел. Эта таблица запрашивается, и результаты в конечном итоге превращаются в XML. Если таблица содержит, например, следующие позиции:

SELECT itemId FROM items WHERE enabled = true
1
2
3
5

Мой окончательный вывод xml после некоторой обработки будет:

 <item id="1" />
 <item id="2" />
 <item id="3" />
 <item id="5" />

xml оказывается довольно большим, и многие элементы фактически являются диапазонами. То, что я хотел бы сделать, это обновить мой запрос, чтобы объединить диапазоны (многие из этих элементов являются «соседями», поэтому сгенерированный XML будет немного меньше). Я пытаюсь получить результаты процедур так:

1-3
5

Так что окончательный XML выглядит примерно так (если я могу просто изменить процедуру, обработка XML может остаться прежней):

<item id="1-3"/>
<item id="5"/>

Я думал, что мой лучший путь может заключаться в использовании самостоятельного соединения, где table1.itemId = table2.itemId - 1, но я не смог заставить его работать. У кого-нибудь есть какие-либо предложения о том, как я могу пойти по этому поводу?

Ответы [ 2 ]

3 голосов
/ 16 июня 2011

Поможет ли это?

SELECT
     MIN(ItemID)
    ,MAX(ItemID)
FROM
    (
        SELECT ItemID, RANK() OVER (ORDER BY ItemID) R FROM Items
    ) Tmp
GROUP BY
    ItemID - R
0 голосов
/ 16 июня 2011

Я думаю, что это должно сработать: 1) упорядочить по itemID 2) использовать OVER ... PARTITION, чтобы получить номер строки 3) использовать его в рекурсивном выражении Common Table, которое соединяет число со всеми остальными, где anchor +номер строки равен ItemID, таким образом, находя все последовательные номера 4), группируются по якору во внешнем запросе, а затем используют MIN и MAX для получения диапазона.

...