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)
我该怎么做,性能最好?我不知道..
您无法使用窗口/分析函数来执行此操作,因为事先不知道断点。有时,可以计算断点。然而,在这种情况下,断点取决于先前值的非线性函数(我现在想不出比“非线性”更好的词)。也就是说,有时向较早的值添加“1”对当前行的计算影响为零。有时它的作用很大。这意味着计算必须从头开始并迭代数据。
使用此类函数对问题进行微小修改即可解决。相反,如果问题是为每个组结转多余的金额(而不是重新计算总和),则可以使用累积总和(以及其他一些技巧)来解决该问题。
递归查询(其他人已经提供)或顺序操作是解决此问题的最佳方法。不幸的是,它没有基于集合的方法来解决它。
您可以使用递归查询
请注意以下查询假设 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)
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |