Sql server 2008 如果命中字段值,则重置运行总计

Sql server 2008 如果命中字段值,则重置运行总计,sql-server-2008,tsql,Sql Server 2008,Tsql,我能够通过下面的查询保持一个运行的总数,它做得很好。我真正想要的是,当差距字段大于或等于date_diff字段时,运行总数应重置为当前hrly_数量。我确信我可以用光标来实现我的结果,但我想知道其他可能的方法。想法 例如: WITH CTE AS ( SELECT a.*, SUM(b.hrly_qty) AS running_total, c.gap FROM #tmpTrxhist2 a INNER JOIN #tmpTrxh

我能够通过下面的查询保持一个运行的总数,它做得很好。我真正想要的是,当差距字段大于或等于date_diff字段时,运行总数应重置为当前hrly_数量。我确信我可以用光标来实现我的结果,但我想知道其他可能的方法。想法

例如:

WITH CTE AS
    (
        SELECT a.*, SUM(b.hrly_qty) AS running_total, c.gap 
        FROM #tmpTrxhist2 a
            INNER JOIN #tmpTrxhist2 b ON a.people_id = b.people_id 
                                      AND b.sequence_id <= a.sequence_id
            INNER JOIN incent_level c ON a.owner_division_id = c.owner_division_id
        GROUP BY a.date_diff, a.owner_division_id, a.people_id, a.sequence_id, 
                 a.hrly_qty, c.gap
    )
SELECT * FROM CTE
ORDER BY people_id, sequence_id

你很少需要光标!一个简单的案例说明就足够了。在我的头顶上有这样的东西:

WITH CTE AS
    (
        SELECT a.*, SUM(b.hrly_qty) AS running_total, c.gap 
        FROM #tmpTrxhist2 a
            INNER JOIN #tmpTrxhist2 b ON a.people_id = b.people_id 
                                      AND b.sequence_id <= a.sequence_id
            INNER JOIN incent_level c ON a.owner_division_id = c.owner_division_id
        GROUP BY a.date_diff, a.owner_division_id, a.people_id, a.sequence_id, 
                 a.hrly_qty, c.gap
    )
SELECT *,

CASE
     WHEN gap >= date_diff then hrly_qty else gap
END as comp_gap

 FROM CTE
ORDER BY people_id, sequence_id

在两者之间运行执行计划,但SQL几乎总是更乐于尝试优化非游标代码。至少在我的领域,你通常会发现“适当的”C/C++程序员过度使用和滥用游标,因为当他们看到有点像while循环的东西而不是考虑数据集时,他们会进入舒适区。有一个地方可以放光标,但这不是它

一个会比另一个好吗?我将如何为此撰写案例陈述?