Sql server 在表格中选择结果范围内的后续数字
我需要以以下格式提交结果:[12-14][20][34-35] 有没有比在这个列的select上迭代游标更智能、更优雅的方法 选择的范围可能相当大 表格:Sql server 在表格中选择结果范围内的后续数字,sql-server,tsql,Sql Server,Tsql,我需要以以下格式提交结果:[12-14][20][34-35] 有没有比在这个列的select上迭代游标更智能、更优雅的方法 选择的范围可能相当大 表格: |---------------------| | col1 | |---------------------| | 12 | |---------------------| | 13 | |---------------------| |
|---------------------|
| col1 |
|---------------------|
| 12 |
|---------------------|
| 13 |
|---------------------|
| 14 |
|---------------------|
| 20 |
|---------------------|
| 34 |
|---------------------|
| 35 |
|---------------------|
正如其他人所说,这是一个缺口和孤岛问题,因此您需要确定哪些数字是序列的开始,哪些数字是序列的结束 我使用两个子查询并将它们连接在一起:
SELECT CASE
WHEN startSeq.Col1 = endSeq.Col1
THEN '[' + CONVERT(VARCHAR(2),startSeq.Col1) +']'
ELSE '[' + CONVERT(VARCHAR(2),startSeq.Col1) + '-' + CONVERT(VARCHAR(2),endSeq.Col1) + ']'
END
FROM (
SELECT Col1,
ROW_NUMBER() OVER(ORDER BY Col1) AS RowN
FROM Nums a
WHERE NOT EXISTS (
SELECT Col1
FROM Nums b
WHERE b.Col1 = a.Col1 - 1
)
) startSeq
JOIN (
SELECT Col1,
ROW_NUMBER() OVER(ORDER BY Col1) AS RowN
FROM Nums a
WHERE NOT EXISTS (
SELECT Col1
FROM Nums b
WHERE b.Col1 = a.Col1 + 1
)
) endSeq
ON startSeq.RowN = endSeq.RowN
听起来像是一个缺口和孤岛问题,
LEAD
。到目前为止,你尝试过什么?你还看了哪些与同一问题(有很多)有关的其他问题,还有哪些问题你不明白?@Larnu我可以用光标迭代来解决,我在这里询问更好的想法。这是一个缺口和孤岛问题,之后可能会有一个聚合来生成范围。这是否回答了您的问题?谢谢你,好先生,它帮助我更快地理解了这个麻烦。