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;