Sql 如何设置带条件的自动增量列值

Sql 如何设置带条件的自动增量列值,sql,hive,hiveql,Sql,Hive,Hiveql,我有这样的桌子: value nextValue 1 2 2 3 3 20 20 21 21 22 22 23 23 NULL 值是按ASC排序的,nextValue是下一行值。 根据条件nextValue value value>10对需求进行分组,并计算不同组中有多少个值 例如,应该有两组(1,2,3)和(20,21,22,23),第一组计数为3,第二组计数为4 我试图用唯一的数字标记每个组,这样我就可以根据这些标记的NUM进行分组 valu

我有这样的桌子:

value nextValue
1     2
2     3
3     20
20    21
21    22
22    23
23    NULL
值是按ASC排序的,nextValue是下一行值。 根据条件nextValue value value>10对需求进行分组,并计算不同组中有多少个值

例如,应该有两组
(1,2,3)
(20,21,22,23)
,第一组计数为3,第二组计数为4

我试图用唯一的数字标记每个组,这样我就可以根据这些标记的NUM进行分组

value nextValue mark
1     2         1
2     3         1
3     20        1
20    21        2
21    22        2
22    23        2
23    NULL      2
但我不知道如何编写标记列,当
nextValue>10
时,我需要一个autocrement变量。
我能让它在蜂箱里发生吗?或者有更好的解决方案来满足需求?

计算以前的值,然后计算新的组标志(如果value-prev\u值>10),然后计算新组标志的累计和以获得组号(标记)。最后,您可以使用analytics函数或group by计算组计数(在我的示例中,analytics count用于显示包含所有中间计算的完整数据集)。请参见代码中的注释

演示:

结果:

value  prev_value  new_group_flag  group_number   group_count
1       \N           0              1              3
2       1            0              1              3
3       2            0              1              3
20      3            1              2              4
21      20           0              2              4
22      21           0              2              4
23      22           0              2              4
40      23           1              3              3
41      40           0              3              3
42      41           0              3              3

计算上一个值,如果value-prev\u值>10,则计算新的\u组\u标志,然后计算新的\u组\u标志的累计和,得到组号(标记)。最后,您可以使用analytics函数或group by计算组计数(在我的示例中,analytics count用于显示包含所有中间计算的完整数据集)。请参见代码中的注释

演示:

结果:

value  prev_value  new_group_flag  group_number   group_count
1       \N           0              1              3
2       1            0              1              3
3       2            0              1              3
20      3            1              2              4
21      20           0              2              4
22      21           0              2              4
23      22           0              2              4
40      23           1              3              3
41      40           0              3              3
42      41           0              3              3

如果我理解正确的话,你可以使用累计金额。想法是在
next\u value-value>10
时设置一个标志。这标识了组。因此,此查询添加了一个组号:

select t.*,
       sum(case when nextvalue > value + 10 then 1 else 0 end) over (order by value desc) as mark
from t
order by value;
您可能觉得这个解决方案不令人满意,因为编号是按降序排列的。因此,更多的算术修正了这一点:

select t.*,
       (sum(case when nextvalue > value + 10 then 1 else 0 end) over () + 1 -
        sum(case when nextvalue > value + 10 then 1 else 0 end) over (order by value desc)
       ) as mark
from t
order by value;

是一个数字小提琴。

如果我理解正确,你可以使用累计总和。想法是在
next\u value-value>10
时设置一个标志。这标识了组。因此,此查询添加了一个组号:

select t.*,
       sum(case when nextvalue > value + 10 then 1 else 0 end) over (order by value desc) as mark
from t
order by value;
您可能觉得这个解决方案不令人满意,因为编号是按降序排列的。因此,更多的算术修正了这一点:

select t.*,
       (sum(case when nextvalue > value + 10 then 1 else 0 end) over () + 1 -
        sum(case when nextvalue > value + 10 then 1 else 0 end) over (order by value desc)
       ) as mark
from t
order by value;
是一把小提琴。

这对我有用 在我的例子中,它需要“无界前一行和当前行之间的行”

select t.*,
       sum(case when nextvalue > value + 10 then 1 else 0 end) over (order by value desc rows between unbounded preceding and current row) as mark
from t
order by value;
这对我有用 在我的例子中,它需要“无界前一行和当前行之间的行”

select t.*,
       sum(case when nextvalue > value + 10 then 1 else 0 end) over (order by value desc rows between unbounded preceding and current row) as mark
from t
order by value;