sql server - 将单个ID组合到范围中

时间:2011-06-16 19:33:31

标签: sql-server self self-join

我有一个包含许多整数的表。查询该表,结果最终变为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 个答案:

答案 0 :(得分:3)

这会有帮助吗?

SELECT
     MIN(ItemID)
    ,MAX(ItemID)
FROM
    (
        SELECT ItemID, RANK() OVER (ORDER BY ItemID) R FROM Items
    ) Tmp
GROUP BY
    ItemID - R

答案 1 :(得分:0)

我认为这应该可以解决问题:1)按itemID排序2)使用OVER ... PARTITION获取行号3)在递归公用表表达式中使用它将数字连接到其他所有其他锚点+行号等于ItemID,从而在外部查询中找到锚点所有序列号4),然后使用MIN和MAX来获取范围。