【发布时间】: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