我正在尝试申请ROW_NUMBER()
根据特定条件增加计数器。
我的数据如下所示,目标计数器是Prep
column
id DSR PrepIndicator Prep
--------------------------------------
1662835 -1 1 1
1662835 14 2 2
1662835 14 2 3
1662835 20 2 4
1667321 -1 1 1
1667321 30 2 2
1667321 14 2 3
1680648 -1 1 1
1680648 14 2 2
1680648 60 1 1
1680648 14 2 2
1680648 14 2 3
1683870 -1 1 1
1683870 12 2 2
1683870 10 2 3
1683870 60 1 1
1683870 7 2 2
忽略PrepIndicator
目前专栏,我尝试实现的业务逻辑如下:
- 对于每个 Id,从 1 开始递增
Prep
如果 DSR 小于 42,则计数器。
- 如果为 42 或更大,请将准备计数器重置为 1。
The PrepIndicator
实际上,创建一个标志来实现这一点,因为如果PrepIndicator = 1
then Prep = 1
. If PrepIndicator = 2
,然后递增Prep
.
我宁愿在没有PrepIndicator
如果可能的话列。
我将如何实现这个条件增量ROW_NUMBER()
?
我试过了
ROW_NUMBER() OVER (PARTITION BY id, PrepIndicator ORDER BY id)
但它似乎不起作用DSR
is >= 42
.
任何建议或帮助都会很棒。谢谢!
首先,您需要明确的排序。仅当您有先前的值时,“递增计数器”才有意义。您可以向表中添加 IDENTITY 列,或使用ROW_NUMBER() OVER ORDER BY(/* your logic here */)
。在您的表中,前三列甚至没有唯一值(请参阅 1680648, 14, 2),因此我认为添加 ID 是正确的方法。
为了实现您想要实现的目标,我相信您必须循环执行此操作。如果你使用ROW_NUMBER()
您可能希望选择一个临时表。根据您问题的性质,术语计数器表示您将有一个变量。
UPDATE TableA SET rowId = ROW_NUMBER() OVER(ORDER BY id, DSR, PrepIndicator)
那么“有条件”似乎表明可以很好地利用CASE http://msdn.microsoft.com/en-us/library/ms181765(v=sql.110).aspx
DECLARE @counter INT = 1
DECLARE @row INT = 1
DECLARE @DSR INT
UPDATE TableA SET Prep = @counter
SET @row = (SELECT rowId FROM TableA WHERE rowId > @row)
WHILE EXISTS( SELECT TOP 1 1 FROM TableA WHERE rowId = @row )
BEGIN
SELECT @DSR = DSR FROM TableA WHERE rowId = @row
SET @counter = CASE WHEN @DSR < 42 THEN @counter + 1 ELSE 1 END
UPDATE TableA SET Prep = @counter WHERE rowId = @row
SET @row = (SELECT rowId FROM TableA WHERE rowId > @row)
END
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)