在T-SQL中运行SUM

MrP*_*ram 5 sql t-sql sql-server

对不起,但我不知道该怎么称呼它...

我有一张桌子看起来像这样:

+-----++-----+
| Id  ||Count|
+-----++-----+
| 1   || 1   |
+-----++-----+
| 2   || 5   |
+-----++-----+
| 3   || 8   |
+-----++-----+
| 4   || 3   |
+-----++-----+
| 5   || 6   |
+-----++-----+
| 6   || 8   |
+-----++-----+
| 7   || 3   |
+-----++-----+
| 8   || 1   |
+-----++-----+
Run Code Online (Sandbox Code Playgroud)

我试图从这个表中做出一个选择,每次row1 + row2 + row3(等)的SUM达到10,那么它就是一个"HIT",并且计数重新开始.

请求的输出:

+-----++-----++-----+
| Id  ||Count|| HIT |
+-----++-----++-----+
| 1   || 1   ||  N  | Count = 1
+-----++-----++-----+
| 2   || 5   ||  N  | Count = 6
+-----++-----++-----+
| 3   || 8   ||  Y  | Count = 14 (over 10)
+-----++-----++-----+
| 4   || 3   ||  N  | Count = 3
+-----++-----++-----+
| 5   || 6   ||  N  | Count = 9
+-----++-----++-----+
| 6   || 8   ||  Y  | Count = 17 (over 10..)
+-----++-----++-----+
| 7   || 3   ||  N  | Count = 3
+-----++-----++-----+
| 8   || 1   ||  N  | Count = 4
+-----++-----++-----+
Run Code Online (Sandbox Code Playgroud)

我该怎么做,性能最好?我不知道..

Gor*_*off 5

您无法使用窗口/分析函数来执行此操作,因为事先不知道断点。有时,可以计算断点。然而,在这种情况下,断点取决于先前值的非线性函数(我现在想不出比“非线性”更好的词)。也就是说,有时向较早的值添加“1”对当前行的计算影响为零。有时它的作用很大。这意味着计算必须从头开始并迭代数据。

使用此类函数对问题进行微小修改即可解决。相反,如果问题是为每个组结转多余的金额(而不是重新计算总和),则可以使用累积总和(以及其他一些技巧)来解决该问题。

递归查询(其他人已经提供)或顺序操作是解决此问题的最佳方法。不幸的是,它没有基于集合的方法来解决它。


Eri*_*icZ 3

您可以使用递归查询

请注意以下查询假设 id 值都是按顺序排列的,否则请使用ROW_NUMBER()创建新的 id

WITH cte AS (
  SELECT id, [Count], [Count] AS total_count
  FROM Table1 
  WHERE id = 1
  UNION ALL
  SELECT t2.id,t2.[Count], CASE WHEN t1.total_count >= 10 THEN t2.[Count] ELSE t1.total_count + t2.[Count] END
  FROM Table1 t2
  INNER JOIN cte t1 
    ON t2.id = t1.id + 1
  )
SELECT *
FROM cte
ORDER BY id
Run Code Online (Sandbox Code Playgroud)

SQL小提琴