问题描述
假设我有下表:
+------+------+--------+
| Col1 | Col2 | NumCol |
+------+------+--------+
| a | z | 1 |
| b | y | 2 |
| c | x | 3 |
| d | w | 0 |
| e | v | 4 |
| f | u | 5 |
| g | t | 0 |
| h | s | 6 |
| i | r | 0 |
+------+------+--------+
所以我想浏览所有记录。每次我在NumCol中找到值0时,我都想选择该记录和它之前的每条记录,直到值0的出现为止。因此,我应该返回这样的内容(如果遍历整个表) :
+------+------+--------+
| Col1 | Col2 | NumCol |
+------+------+--------+
| a | z | 1 |
| b | y | 2 |
| c | x | 3 |
| d | w | 0 |
+------+------+--------+
+------+------+--------+
| Col1 | Col2 | NumCol |
+------+------+--------+
| e | v | 4 |
| f | u | 5 |
| g | t | 0 |
+------+------+--------+
+------+------+--------+
| Col1 | Col2 | NumCol |
+------+------+--------+
| h | s | 6 |
| i | r | 0 |
+------+------+--------+
解决方法
如果您使用的是Microsoft -SQL,我建议您使用“游标”。 您可以使用游标一一遍历记录,并在记录达到零时将其切断。 您可能想要创建一个与列出的表分开的表,可以从游标中获取该表,因为这样做可以加快处理速度。 如果您尝试在内存中执行所有这些操作,则可能会遇到困难。
,首先,SQL表表示无序集。我假设前两列指定了排序。
您可以使用累积总和来枚举组-通过在每行上或后添加0
的数量。然后,要获取从零开始的值,可以从零的总数中减去:
select t.*
from (select t.*,(sum(case when num_col = 0 then 1 else 0 end) over () + 1 -
sum(case when numcol = 0 then 1 else 0 end) over (order by col1 desc,col2 desc)
) as grp
from t
) t;
您现在可以仅使用where grp = N
选择行组。