Sql 列与值匹配时有效的行号增量
我试图找到一种有效的方法,仅从Id和State派生下面所期望的列。我想要的是,每次状态为0时,按Id排序时,期望增加的数量 我使用以下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
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;