是否有一个tSQL函数,可在每次更改(如Value2按Value1排序)后创建计数器
我必须开发一个SQL脚本,在另一列排序的表的值每次更改后创建计数器 请参阅示例:“ExpectedCalculatedValue”列应尽可能由tsQL计算 我已经尝试过“Rank”或“densite_-Rank”之类的函数,但我无法解决这个问题是否有一个tSQL函数,可在每次更改(如Value2按Value1排序)后创建计数器,sql,tsql,Sql,Tsql,我必须开发一个SQL脚本,在另一列排序的表的值每次更改后创建计数器 请参阅示例:“ExpectedCalculatedValue”列应尽可能由tsQL计算 我已经尝试过“Rank”或“densite_-Rank”之类的函数,但我无法解决这个问题 将@testTab声明为表(ID int,[From]datetime,直到datetime,TestID int, ExpectedCalculatedValue(整数) --测试数据 插入@testTab值(100,'2019-4-11 11:00'
将@testTab声明为表(ID int,[From]datetime,直到datetime,TestID int,
ExpectedCalculatedValue(整数)
--测试数据
插入@testTab值(100,'2019-4-11 11:00','2019-4-11 11:01',0,1)
插入@testTab值(100,'2019-4-11 11:01','2019-4-11 11:11',200,2)
插入@testTab值(100,'2019-4-11 11:11','2019-4-11 11:15',200,2)
插入@testTab值(100,'2019-4-11 11:15','2019-4-11 11:22',100,3)
插入@testTab值(100,'2019-4-11 11:22','2019-4-11 11:45',200,4)
选择*
来自@testTab a
由[从]发出的命令
您的数据中的时间列有一个精确的副本。这真的让人扫兴。所以,首先要做的是引入一个唯一的数字。在这种情况下,它使用行编号()
:
但是,我建议在表中包括一个标识列,并使用该列,如。选择,
求和(base.pVal=base.TestID,则为0,否则为1)超过(按基数排序。[From])作为[计数器]
从…起
(选择aa.,滞后(aa.TestID,1,null)超过(按aa.[From]排序)作为[pVal]
来自@testTab aa)基地Thx戈登,完美。我还找到了一个几乎相同的解决方案。
select a.*,
sum(case when prev_testid = testid then 0 else 1 end) over (partition by id order by [from], seqnum) as calculated_valued
from (select a.*,
lag(testid) over (partition by id order by [from], seqnum) as prev_testid
from (select a.*, row_number() over (partition by id order by [from], [until], testid) as seqnum
from @testTab a
) a
) a
order by a.[From];