SQL / T-SQL。从数字创建范围

Paw*_*ńca 4 sql t-sql sql-server-2008 gaps-and-islands

我有一张桌子号码ex:

  nums
  _____
| 54902 |
| 54903 | 
| 54901 | 
| 54904 | 
| 54905 | 
| 3487  | 
| 3457  | 
| 789   | 
| 790   | 
| 54906 | 
| 791   | 
| 76253 | 
Run Code Online (Sandbox Code Playgroud)

我想从这个集合中创建范围,例如(如果可能的话...):

54901-54906
3487
3457 
789-791
76253
Run Code Online (Sandbox Code Playgroud)

有小费吗?

Ser*_*lan 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
Run Code Online (Sandbox Code Playgroud)

结果:

---------------------
789-791
3457
3487
54901-54906
76253
Run Code Online (Sandbox Code Playgroud)

  • 如果您可以添加有关代码功能的文字说明,则此答案会更好。我对代码格式进行了一些更改,以使其更具可读性,但您应该添加解释。 (2认同)