Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
Sql 列与值匹配时有效的行号增量_Sql_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 列与值匹配时有效的行号增量

Sql 列与值匹配时有效的行号增量,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我试图找到一种有效的方法,仅从Id和State派生下面所期望的列。我想要的是,每次状态为0时,按Id排序时,期望增加的数量 我使用以下SQL成功地实现了这一点,但当数据集很大时,执行时间非常短: WITH Groups AS ( SELECT Id, ROW_NUMBER() OVER (ORDER BY Id) AS GroupId FROM tblState WHERE State=0 ) SELECT S.Id, S.[State], S.Expected, G.GroupId F

我试图找到一种有效的方法,仅从Id和State派生下面所期望的列。我想要的是,每次状态为0时,按Id排序时,期望增加的数量

我使用以下SQL成功地实现了这一点,但当数据集很大时,执行时间非常短:

WITH Groups AS 
(
   SELECT Id, ROW_NUMBER() OVER (ORDER BY Id) AS GroupId FROM tblState WHERE State=0
)
SELECT S.Id, S.[State], S.Expected, G.GroupId FROM tblState S
   OUTER APPLY (SELECT TOP 1 GroupId FROM Groups WHERE Groups.Id <= S.Id ORDER BY Id DESC) G

有没有一种更简单、更有效的方法来产生这种结果?在SQL Server 2012或更高版本中,只需使用累计总和:

select s.*,
       sum(case when state = 0 then 1 else 0 end) over (order by id) as expected
from tblState s;

只需使用累计金额:

select s.*,
       sum(case when state = 0 then 1 else 0 end) over (order by id) as expected
from tblState s;
其他方法使用子查询:

其他方法使用子查询:


天哪,这太简单了。谢谢你,看起来很有魅力天哪,这太简单了。谢谢你,看起来很有魅力
select *,
       (select count(*)
        from table t1
        where t1.id < t.id and state = 0
       ) as expected
from table t;