我有一个表号ex:
nums
_____
| 54902 |
| 54903 |
| 54901 |
| 54904 |
| 54905 |
| 3487 |
| 3457 |
| 789 |
| 790 |
| 54906 |
| 791 |
| 76253 |
我想从这个集合中创建范围(如果可能的话...):
54901-54906
3487
3457
789-791
76253
有什么提示吗?
答案 0 :(得分:7)
用于获得这种范围。首先,您应该对序列号进行分组-为此,您可以使用gaps-and-islands
方法-。之后,您可以轻松获得每个组的max
和min
号。
DECLARE @nums TABLE(num int)
INSERT INTO @nums VALUES
( 54902 ),
( 54903 ),
( 54901 ),
( 54904 ),
( 54905 ),
( 3487 ),
( 3457 ),
( 789 ),
( 790 ),
( 54906 ),
( 791 ),
( 76253 )
SELECT CAST(MIN(num) AS varchar(10))
+ CASE WHEN MAX(num) > MIN(num) THEN '-' + CAST(MAX(num) AS varchar(10)) ELSE '' END
FROM (
SELECT num, num - ROW_NUMBER() OVER (ORDER BY num) AS GRP
FROM @nums
) AS T
GROUP BY GRP
结果:
---------------------
789-791
3457
3487
54901-54906
76253