首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用递归解决连续序列中的空位?

如何用递归解决连续序列中的空位?
EN

Stack Overflow用户
提问于 2016-03-24 15:17:05
回答 2查看 52关注 0票数 1
代码语言:javascript
运行
复制
 X  Y
-------
 A  1
 B  5
 C  9

我有一个类似上面的数据的结果集,并希望获得与Y中的间隙相对应的前一条记录的X值,这基本上类似于下面的数据。实现这一目标的不同方法有哪些?

代码语言:javascript
运行
复制
X   Y
-------
 A  1
 A  2
 A  3
 A  4
 B  5
 B  6
 B  7
 B  8
 C  9
EN

回答 2

Stack Overflow用户

发布于 2016-03-24 15:31:41

代码语言:javascript
运行
复制
declare @tbl table
(
    X   char,
    Y   int
)

insert into @tbl select 'A', 1
insert into @tbl select 'B', 5
insert into @tbl select 'C', 9

-- Query 1 : recursive CTE 
; with 
cte as
(
    select  rn = ROW_NUMBER() over (order by Y), X, Y
    from    @tbl
),
rcte as
(
    select  rn, X, Y 
    from    cte 
    where   rn  = 1

    union all

    select  rn  = case when r.Y + 1 < c.Y then r.rn else c.rn end, 
        X   = case when r.Y + 1 < c.Y then r.X else c.X end, 
        Y   = case when r.Y + 1 < c.Y then r.Y + 1 else c.Y end
    from    rcte r
        inner join cte c    on  r.rn = c.rn - 1
)
select  *
from    rcte

-- Query 2 : tally table method. Required SQL Server 2012+

; with tally as
(
    select  n = 1
    union all
    select  n = n + 1
    from    tally
    where   n <= 100
),
cte as
(   select  *, next_Y = isnull(LEAD(Y) OVER (ORDER BY Y), Y + 1)
    from    @tbl t
)
select  c.X, n.n as Y
from    cte c
    cross join tally n
where   n.n >= c.Y
and n.n < c.next_Y
票数 3
EN

Stack Overflow用户

发布于 2016-03-24 16:06:48

尝试这个简单的查询(假设@tbl是您的表/结果集)

代码语言:javascript
运行
复制
WITH cte_test
AS
(
    SELECT t.X,t.Y,isnull((SELECT min(t1.Y) FROM @tbl t1 WHERE t1.X > t.X),t.Y) AS maxval FROM @tbl t
    UNION ALL
    SELECT t.X,c.Y+1,c.maxval FROM cte_test c
    INNER JOIN @tbl t ON c.X = t.X
    WHERE c.Y+1 < c.maxval
)
SELECT X,Y FROM cte_test ORDER BY 1,2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36194967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档