我想知道是否可以为一组id计算特定值的连续范围,并返回每个id的计算值。给出以下数据:
+----+----------+--------+
| ID | DATE_KEY | CREDIT |
+----+----------+--------+
| 1 | 8091 | 0.9 |
| 1 | 8092 | 20 |
| 1 | 8095 | 0.22 |
| 1 | 8096 | 0.23 |
| 1 | 8098 | 0.23 |
| 2 | 8095 | 12 |
| 2 | 8096 | 18 |
| 2 | 8097 | 3 |
| 2 | 8098 | 0.25 |
+----+----------+--------+
我想要以下输出:
+----+-------------------------------+
| ID | RANGE_DAYS_CREDIT_LESS_THAN_1 |
+----+-------------------------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 1 |
| 2 | 1 |
+----+-------------------------------+
在这种情况下,范围是信用小于1的连续天数。如果date和key列之间有间隔,那么范围就不必取下一个值,就像在id 1中8096和8098之间的date key一样。是否可以在配置单元中使用窗口功能来执行此操作?
提前谢谢!
2条答案
按热度按时间qnzebej01#
关键是折叠所有连续的序列并计算它们的长度,我以一种相对笨拙的方式努力做到这一点:
对于每个原始a,获取序列中的前一个数字b;
检查a-b==1,显示是否有“间隙”,标记为“v”;
将所有a-b合并为一个字符串,然后使用“v”拆分,并计算长度。
为了得到id列,应该考虑另一个编码id的字符串。
de90aj5v2#
您可以通过运行sum将行分为多个组来实现这一点,每次找到<1行的信用卡时(按日期键顺序)递增1。从那以后,它只是一个
group by
.