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
能写个伪代码look look么
#3
感觉你需要用游标啊,直接FETCH NEXT就是下一行数据了,不过除非绝对的必要,不应该使用游标
替代的,你可以对表的列updateDate 进行ROW_NUMBER()一下,之后根据行号就可以取到下一行了
#4
用游标能拿到当前行数据,我想既能拿当前行数据还能拿下一行数据;要用下一行的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
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
其实上述表已经是存储过程根据条件查询出来的结果。
#10
@ky_min
把你的代码加进去 可以了。
80 0.12 2015-03-06 00:00:00.000 2 2
80 0.13 2015-02-06 00:00:00.000 1 1
把你的代码加进去 可以了。
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
能写个伪代码look look么
#3
感觉你需要用游标啊,直接FETCH NEXT就是下一行数据了,不过除非绝对的必要,不应该使用游标
替代的,你可以对表的列updateDate 进行ROW_NUMBER()一下,之后根据行号就可以取到下一行了
#4
用游标能拿到当前行数据,我想既能拿当前行数据还能拿下一行数据;要用下一行的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
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
其实上述表已经是存储过程根据条件查询出来的结果。
#10
@ky_min
把你的代码加进去 可以了。
80 0.12 2015-03-06 00:00:00.000 2 2
80 0.13 2015-02-06 00:00:00.000 1 1
把你的代码加进去 可以了。
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