【问题标题】:Is anything like LAG() or LEAD() in SQL Server 2000SQL Server 2000 中的 LAG() 或 LEAD() 之类的东西
【发布时间】:2019-07-08 02:26:43
【问题描述】:

我想获取当前行中的下一行值。就像LEAD() 在最新的 SQL Server 中所做的那样。但我目前使用的是 SQL Server 2000。而且我没有任何其他选择。

实际情况是:

表格规则

#   HeadNo | NextHeadNo |     NoFrom
-----------+------------+------------
1    AA    |    AB      |        1
2    AB    |    AC      |        1
3    AC    |    AX      |        1
4    AD    |    AE      |        1   ****and so on

我想根据HeadNo 上的下一个值更新NextHeadNo 值。

所以根据数据Row-3 应该得到更新AX ➪ AD

我有大约 1000 条记录要更新一次。

我希望任何人都可以帮助我。

【问题讨论】:

  • 您可以在 tb1.id = tb2.id+1 上加入同一张表(自连接).....
  • @SQLCoder: 实际上表中没有任何 Id 列
  • 您知道要根据哪一列选择下一个值吗?
  • 您需要有一个列进行排序,您将根据该列选择下一条记录。
  • @SQLCoder:如示例所示,取ORDER BY Head_No的下一个值

标签: sql-server sql-server-2000 lag lead


【解决方案1】:

您可以尝试如下使用子查询。

SELECT *, 
       (SELECT TOP 1 headno 
        FROM   @table T2 
        WHERE  T2.headno > T1.headno 
        ORDER  BY headno) NextHeadNo 
FROM   @table T1 
ORDER  BY headno 

Online Demo

要更新,你可以尝试如下。

UPDATE T1 SET NextHeadNo= 
       (SELECT TOP 1 headno 
        FROM   @table T2 
        WHERE  T2.headno > T1.headno 
        ORDER  BY headno)  
FROM   @table T1

编辑:

但在最后一行得到 NULL,所以我想给出它的参考 第一排。我该怎么做?

我建议你写一个单独的更新语句,而不是像下面这样写CASE WHEN

update t
set t.NextHeadNo =
 (
  select top 1 HeadNo from @table order by HeadNo
 )
from @table t
where t.NextHeadNo is null

【讨论】:

  • 谢谢,成功了。但在最后一行得到 NULL,所以我想引用第一行。我该怎么做?
  • 您可以编写单独的更新或将 case 表达式放在同一个查询中
  • @jap_jap,我已经更新了答案,你可以看看。
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多