如何根据所需值使用SparkSQL在位置上选择记录?

问题描述

假设我有下表:

+------+------+--------+
| 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选择行组。