存储过程中如何取当前行的下一条数据

时间:2021-01-21 05:59:37
ID    money            startDate                                    endDate                        proid        rate           updateDate
80 1000000.00 2015-05-02 00:00:00.000 2016-02-06 00:00:00.000       4         0.13     2015-02-06 00:00:00.000
80 1000000.00 2015-05-02 00:00:00.000 2016-02-06 00:00:00.000       4         0.12     2015-03-06 00:00:00.000
80 1000000.00 2015-05-02 00:00:00.000 2016-02-06 00:00:00.000       4         0.13     2015-08-06 00:00:00.000


在存储过程当中如何取到下一个updateDate的值,比如当前循环数据是第一行数据,当前updateDate是2015-02-06,在当前行的情况下怎么取到下一行updateDate也就是2015-03-06这个值呢?

10 个解决方案

#1


按UpdateDate,排下序,然后按序取值

#2


引用 1 楼 jamesrggg 的回复:
按UpdateDate,排下序,然后按序取值

能写个伪代码look look么

#3


感觉你需要用游标啊,直接FETCH NEXT就是下一行数据了,不过除非绝对的必要,不应该使用游标
替代的,你可以对表的列updateDate 进行ROW_NUMBER()一下,之后根据行号就可以取到下一行了

#4


引用 3 楼 ky_min 的回复:
感觉你需要用游标啊,直接FETCH NEXT就是下一行数据了,不过除非绝对的必要,不应该使用游标
替代的,你可以对表的列updateDate 进行ROW_NUMBER()一下,之后根据行号就可以取到下一行了


用游标能拿到当前行数据,我想既能拿当前行数据还能拿下一行数据;要用下一行的updateDate-当前行的updateDate

#5


;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM 源表
)
,CTE2 AS(
SELECT * FROM CTE WHERE 条件
)
SELECT * FROM CTE2
UNION ALL
SELECT T2.* FROM CTE2 T1
LEFT JOIN CTE T2 ON T1.RN+1=T2.RN
根据你的描述,我想这个应该是你想要的,不过不知道你明白不?

#6


;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM 源表
)
,CTE2 AS(
SELECT * FROM CTE WHERE 条件
)
SELECT * FROM CTE2
UNION
SELECT T2.* FROM CTE2 T1
JOIN CTE T2 ON T1.RN+1=T2.RN
我小调整了一下,你存储过程代入的条件,放到上面语句中条件的地方

#7


Declare @Date DateTime
Set @Date = 0

While (Select Count(1) From T1 Where UpdateDate > @Date) > 0
Begin
Select @Date = Min(UpdateDate) From T1 Where UpdateDate > @Date

--业务处理


End

#8


按照每一页一行的规则, 用分页的方法实现吧,不要用当前行这种概念了,已经过时.

#9


引用 6 楼 ky_min 的回复:
;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM 源表
)
,CTE2 AS(
SELECT * FROM CTE WHERE 条件
)
SELECT * FROM CTE2
UNION
SELECT T2.* FROM CTE2 T1
JOIN CTE T2 ON T1.RN+1=T2.RN
我小调整了一下,你存储过程代入的条件,放到上面语句中条件的地方


其实上述表已经是存储过程根据条件查询出来的结果。

#10


@ky_min 
把你的代码加进去 可以了。

with tabs AS(
SELECT TOP 2  id,CurrentRate,UpdateDate,ROW_NUMBER()OVER(ORDER BY ProductId) AS [ROWS] FROM(
SELECT w.id,w.Money,w.LendDate, w.EndLendDate , w.ProductId , u.CurrentRate , u.UpdateDate, rn = ROW_NUMBER()OVER(PARTITION BY w.id, w.Money, w.LendDate, w.EndLendDate,w.ProductId,u.UpdateDate ORDER BY w.id,w.Money)
         FROM crm.CC_Wish w
            INNER JOIN crm.CC_UpdateInfo u ON w.id = u.WishID) t WHERE  rn=1 AND id=80 AND t.LendDate>='20140101' AND t.EndLendDate<='20160606' 
           
          ORDER BY t.UpdateDate 
)

 , CTE AS(
    SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM tabs
)
,CTE2 AS(
    SELECT * FROM CTE 
)
SELECT * FROM CTE2
UNION
SELECT T2.* FROM CTE2 T1
    JOIN CTE T2 ON T1.RN+1=T2.RN



80 0.12 2015-03-06 00:00:00.000 2 2
80 0.13 2015-02-06 00:00:00.000 1 1

#1


按UpdateDate,排下序,然后按序取值

#2


引用 1 楼 jamesrggg 的回复:
按UpdateDate,排下序,然后按序取值

能写个伪代码look look么

#3


感觉你需要用游标啊,直接FETCH NEXT就是下一行数据了,不过除非绝对的必要,不应该使用游标
替代的,你可以对表的列updateDate 进行ROW_NUMBER()一下,之后根据行号就可以取到下一行了

#4


引用 3 楼 ky_min 的回复:
感觉你需要用游标啊,直接FETCH NEXT就是下一行数据了,不过除非绝对的必要,不应该使用游标
替代的,你可以对表的列updateDate 进行ROW_NUMBER()一下,之后根据行号就可以取到下一行了


用游标能拿到当前行数据,我想既能拿当前行数据还能拿下一行数据;要用下一行的updateDate-当前行的updateDate

#5


;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM 源表
)
,CTE2 AS(
SELECT * FROM CTE WHERE 条件
)
SELECT * FROM CTE2
UNION ALL
SELECT T2.* FROM CTE2 T1
LEFT JOIN CTE T2 ON T1.RN+1=T2.RN
根据你的描述,我想这个应该是你想要的,不过不知道你明白不?

#6


;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM 源表
)
,CTE2 AS(
SELECT * FROM CTE WHERE 条件
)
SELECT * FROM CTE2
UNION
SELECT T2.* FROM CTE2 T1
JOIN CTE T2 ON T1.RN+1=T2.RN
我小调整了一下,你存储过程代入的条件,放到上面语句中条件的地方

#7


Declare @Date DateTime
Set @Date = 0

While (Select Count(1) From T1 Where UpdateDate > @Date) > 0
Begin
Select @Date = Min(UpdateDate) From T1 Where UpdateDate > @Date

--业务处理


End

#8


按照每一页一行的规则, 用分页的方法实现吧,不要用当前行这种概念了,已经过时.

#9


引用 6 楼 ky_min 的回复:
;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM 源表
)
,CTE2 AS(
SELECT * FROM CTE WHERE 条件
)
SELECT * FROM CTE2
UNION
SELECT T2.* FROM CTE2 T1
JOIN CTE T2 ON T1.RN+1=T2.RN
我小调整了一下,你存储过程代入的条件,放到上面语句中条件的地方


其实上述表已经是存储过程根据条件查询出来的结果。

#10


@ky_min 
把你的代码加进去 可以了。

with tabs AS(
SELECT TOP 2  id,CurrentRate,UpdateDate,ROW_NUMBER()OVER(ORDER BY ProductId) AS [ROWS] FROM(
SELECT w.id,w.Money,w.LendDate, w.EndLendDate , w.ProductId , u.CurrentRate , u.UpdateDate, rn = ROW_NUMBER()OVER(PARTITION BY w.id, w.Money, w.LendDate, w.EndLendDate,w.ProductId,u.UpdateDate ORDER BY w.id,w.Money)
         FROM crm.CC_Wish w
            INNER JOIN crm.CC_UpdateInfo u ON w.id = u.WishID) t WHERE  rn=1 AND id=80 AND t.LendDate>='20140101' AND t.EndLendDate<='20160606' 
           
          ORDER BY t.UpdateDate 
)

 , CTE AS(
    SELECT *,ROW_NUMBER()OVER(ORDER BY updateDate)RN FROM tabs
)
,CTE2 AS(
    SELECT * FROM CTE 
)
SELECT * FROM CTE2
UNION
SELECT T2.* FROM CTE2 T1
    JOIN CTE T2 ON T1.RN+1=T2.RN



80 0.12 2015-03-06 00:00:00.000 2 2
80 0.13 2015-02-06 00:00:00.000 1 1