首页 > 解决方案 > SQL Server - 范围号

问题描述

我需要您的帮助才能从给定的输入中获得以下输出。

输入

桌子:Sample

ID
---
1
2
3
4

输出

ID
---
1
2
2
3
3
3
4
4
4
4

标签: sqlsql-servertsqlsql-server-2012

解决方案


自加入:

select s.id
from sample s inner join sample ss
on s.id >= ss.id 
order by s.id

请参阅演示
结果:

> | id |
> | -: |
> |  1 |
> |  2 |
> |  2 |
> |  3 |
> |  3 |
> |  3 |
> |  4 |
> |  4 |
> |  4 |
> |  4 |

如果 id 之间存在间隙或最小值大于 1,则可以使用递归 CTE:

declare @maxid int = (select max(id) from sample);
with allids AS (
  select 1 id
  union all
  select id + 1 FROM allids where id + 1 <= @maxid
)
select s.id
from sample s inner join allids ss
on s.id >= ss.id
order by s.id

请参阅演示

INSERT INTO Sample ( ID ) VALUES ( 2 ), ( 3 ), ( 5 ), ( 7 ), ( 9 );

结果:

> | id |
> | -: |
> |  2 |
> |  2 |
> |  3 |
> |  3 |
> |  3 |
> |  5 |
> |  5 |
> |  5 |
> |  5 |
> |  5 |
> |  7 |
> |  7 |
> |  7 |
> |  7 |
> |  7 |
> |  7 |
> |  7 |
> |  9 |
> |  9 |
> |  9 |
> |  9 |
> |  9 |
> |  9 |
> |  9 |
> |  9 |
> |  9 |

使用此解决方案,您不必对表的 id 进行硬编码(它们可以是多少?),即使您添加或删除 ids也可以工作。


推荐阅读