问题描述
嗨,汤姆,
每当连续序列发生变化时,我需要帮助以获取序列no或秩以下是示例-
输入
seq,id,值
1、1,200
2、1,200
3、1,300
4、1,200
5、1,200
6、1,500
7、1,500
8、1,700
预期出相同的id组合,按顺序顺序的值应分配一个值。
对于id 1和值200-rnk应该为1,然后在第三行中发生变化-然后rnk = 2,然后应在第4行中分配新的rnk 3,而不是1,依此类推。
seq、id、值、rnk
1、1,200,1
2、1,200,1
3、1,300,2
4、1,200,3,
5、1,200,3,
6、1,500,4
7、1,500,4
8、1,700,5
9、1,800、6
我已经尝试了lead,lag,first_value,last_value,rank,dense_rank和row_number分析函数,但是我无法实现要求。
每当连续序列发生变化时,我需要帮助以获取序列no或秩以下是示例-
输入
seq,id,值
1、1,200
2、1,200
3、1,300
4、1,200
5、1,200
6、1,500
7、1,500
8、1,700
预期出相同的id组合,按顺序顺序的值应分配一个值。
对于id 1和值200-rnk应该为1,然后在第三行中发生变化-然后rnk = 2,然后应在第4行中分配新的rnk 3,而不是1,依此类推。
seq、id、值、rnk
1、1,200,1
2、1,200,1
3、1,300,2
4、1,200,3,
5、1,200,3,
6、1,500,4
7、1,500,4
8、1,700,5
9、1,800、6
我已经尝试了lead,lag,first_value,last_value,rank,dense_rank和row_number分析函数,但是我无法实现要求。
专家解答
因此,您想按SEQ对值进行排序,然后根据值更改时分配排名?
这是使用模式匹配 (match_regnize) 的一种方法
-按id划分,按seq排序
-将当前值 = prev (值) 的行组合在一起
-您希望将其用于任何行,然后是任意数量的行; 因此,这是 (init相同 *) 的模式
-使用match_number分配组号
-使用dense_rank中的此组编号分配等级
这给出了:
了解更多关于模式匹配的信息https://www.slideshare.net/ChrisSaxon1/how-to-find-patterns-in-your-data-with-sql
这是使用模式匹配 (match_regnize) 的一种方法
-按id划分,按seq排序
-将当前值 = prev (值) 的行组合在一起
-您希望将其用于任何行,然后是任意数量的行; 因此,这是 (init相同 *) 的模式
-使用match_number分配组号
-使用dense_rank中的此组编号分配等级
这给出了:
create table t (
c1 int, c2 int, c3 int
);
insert into t values ( 1,1,200 );
insert into t values ( 2,1,200 );
insert into t values ( 3,1,300 );
insert into t values ( 4,1,200 );
insert into t values ( 5,1,200 );
insert into t values ( 6,1,500 );
insert into t values ( 7,1,500 );
insert into t values ( 8,1,700 );
commit;
select c1, c2, c3,
dense_rank () over (
partition by c2
order by grp
) rk,
grp
from t
match_recognize (
partition by c2
order by c1
measures
match_number() as grp
all rows per match
pattern ( init same* )
define
same as c3 = prev ( c3 )
);
C1 C2 C3 SEQ GRP
1 1 200 1 1
2 1 200 1 1
3 1 300 2 2
4 1 200 3 3
5 1 200 3 3
6 1 500 4 4
7 1 500 4 4
8 1 700 5 5 了解更多关于模式匹配的信息https://www.slideshare.net/ChrisSaxon1/how-to-find-patterns-in-your-data-with-sql
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




