【问题标题】:TSQL retreive the next item if item has already been assignedT SQL 检索下一个项目,如果项目已经被分配
【发布时间】:2026-01-03 14:00:01
【问题描述】:

我有一个示例数据集,如下所示:

如果该值尚未被获取,我需要返回下一个值。

我想通过不使用游标来实现这一点。应返回的数据以黄色突出显示。

有什么想法吗?

谢谢

【问题讨论】:

  • 从您的示例中我不清楚您如何确定要返回哪一行。你能更明确地定义它吗?
  • 你如何定义“下一个价值”?什么“价值尚未被采用”?

标签: sql tsql greatest-n-per-group recursive-query


【解决方案1】:

这是使用递归 cte 和窗口函数的一种方法:

with 
    tab as (
        select 
            t.*, 
            dense_rank() over(order by item) drn
        from mytable t
    ),
    cte as (
        select t.* from tab t where drn = 1
        union all
        select t.*
        from tab t
        inner join cte c on t.drn = c.drn + 1 and t.itemb > c.itemb
    )
select select item, itemb, date
from cte c
where itemb = (select min(itemb) from cte c1 where c1.item = c.item)

派生表tab根据item为每条记录分配等级(具有相同item的记录获得相同等级)。

然后递归cte从第一个item对应的行开始,逐个处理items,保证“下一个”itemb大于前一个。

最后,外部查询根据item 过滤第一个itemb

Demo on DB Fiddle

项目 |项目 |日期 :--- | :---- | :--------- X |一个 | 2014-01-01 是 |乙| 2014-01-02 Z | C | 2014-01-02

【讨论】: