Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一个tSQL函数,可在每次更改(如Value2按Value1排序)后创建计数器_Sql_Tsql - Fatal编程技术网

是否有一个tSQL函数,可在每次更改(如Value2按Value1排序)后创建计数器

是否有一个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'

我必须开发一个SQL脚本,在另一列排序的表的值每次更改后创建计数器

请参阅示例:“ExpectedCalculatedValue”列应尽可能由tsQL计算

我已经尝试过“Rank”或“densite_-Rank”之类的函数,但我无法解决这个问题

将@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];