2

我有一个包含很多整数的表。该表被查询,结果最终被转换为 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但我无法让它工作。有人对我如何解决这个问题有任何建议吗?

4

2 回答 2

3

这会有帮助吗?

SELECT
     MIN(ItemID)
    ,MAX(ItemID)
FROM
    (
        SELECT ItemID, RANK() OVER (ORDER BY ItemID) R FROM Items
    ) Tmp
GROUP BY
    ItemID - R
于 2011-06-16T19:49:00.643 回答
0

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

于 2011-06-16T19:49:33.910 回答