【问题标题】:I need to sequence a Num_Linea column, but the sequence must be restarted for each ID_PO我需要对 Num_Linea 列进行排序,但必须为每个 ID_PO 重新启动序列
【发布时间】:2023-02-25 01:55:15
【问题描述】:

当前游标执行序列但在 ID_PO 不同时不会重新启动。

DECLARE @Num_Line as int;
DECLARE @CurNum_Line as int;

select @Num_Line = 1;

DECLARE LINECURSOR CURSOR FOR
    SELECT Num_Linea
    FROM   #temp

OPEN LINECURSOR;

FETCH NEXT FROM LINECURSOR INTO @CurNum_Line

WHILE @@FETCH_STATUS = 0
    BEGIN
        UPDATE #temp
        SET    Num_Linea = @Num_Line
        WHERE  CURRENT OF LINECURSOR;

        SELECT @Num_Line = @Num_Line + 1;

        FETCH NEXT FROM LINECURSOR INTO @CurNum_Line
    END;

CLOSE LINECURSOR;

DEALLOCATE LINECURSOR;

这是我得到的结果

ID_PO Num_Line
51249 1
51249 2
51249 3
51249 4
71086 5
71086 6
71086 7
71108 8
71108 9
71198 10

我需要的结果

ID_PO Num_Line
51249 1
51249 2
51249 3
51249 4
71086 1
71086 2
71086 3
71108 1
71108 2
71198 1

【问题讨论】:

  • 它看起来像是分析函数 ROW_NUMBER()OVER(PARTITION BY ID_PO) 的任务。您能否提供示例数据和所需的输出
  • ROW_NUMBER就是你想要的。编写 SQL 时不要以编程方式思考,这样的思考会导致结果缓慢。 SQL 在集合中工作,因此您需要使用基于集合的思维方式。不要考虑需要对行做什么,而要考虑需要对列做什么。

标签: sql-server database-cursor


【解决方案1】:

SQL Server 没有内置任何东西来自动具有重置序列并以您想要的方式存储数据。相反,当前推荐做法是使用类似于第一个(不需要的)结果的简单sequence 来存储数据。更糟糕的是,数据现在可能还会在序列中出现缺口。

不过,还是有好消息。

首先,这可以让你扔掉所有的代码:SQL Server 将完全自动地为你维护它,不需要曾经运行手动更新,尤其是不需要循环或游标。您也可以摆脱临时表。(专业提示:真正的专业人士倾向于尽可能避免这些结构)。

其次,这些信息足以在输出时完全按照您想要的方式显示数据。您可以通过 row_number() 函数和 PARTITION BY 子句完成此操作。假设使用第一个(错误的)选项将数据存储在 #temp 中,您可以通过从中选择这样的方式将其显示给用户:

SELECT ID_PO, 
    row_number() over (ORDER BY ID_PO, Num_Linea PARTITION BY ID_PO) as Num_Linea
FROM #temp

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2021-10-10
    相关资源
    最近更新 更多