我一直试图将存储在我的oracle数据库中的数据组分开,以便进行更准确的分析。
Current Output
Time Location
10:00 A111
11:00 A112
12:00 S111
13:00 S234
17:00 A234
18:00 S747
19:00 A878
Desired Output
Time Location Group Number
10:00 A111 1
11:00 A112 1
12:00 S111 1
13:00 S234 1
17:00 A234 2
18:00 S747 2
19:00 A878 3
我一直在尝试使用over和partition by来分配值,但是我只能在变化时不断增加。也尝试使用滞后但我努力使用它。
我只需要第二列中的值从1开始,并在字段1的第一个字母发生更改时递增(使用substr)。
这是我尝试使用row_number,但我认为我离我很远。输出中有一个时间列,上面没有显示。
select event_time, st_location, Row_Number() over(partition by
SUBSTR(location,1,1) order
by event_time)
as groupnumber from pic
任何帮助都会非常感激!
编辑:
Time Location Group Number
10:00 A-10112 1
11:00 A-10421 1
12:00 ST-10621 1
13:00 ST-23412 1
17:00 A-19112 2
18:00 ST-74712 2
19:00 A-87812 3
答案 0 :(得分:3)
这是一个差距和岛屿问题。使用以下代码:
select location,
dense_rank() over (partition by SUBSTR(location,1,1) order by grp)
from
(
select (row_number() over (order by time)) -
(row_number() over (partition by SUBSTR(location,1,1) order by time)) grp,
location,
time
from data
) t
order by time
主要思想是在子查询中隔离连续的项目序列(计算grp
列)。如果您拥有grp
列,其余部分很简单。
答案 1 :(得分:1)
select DENSE_RANK() over(partition by SUBSTR("location",1,1) ORDER BY SUBSTR("location",1,2))
as Rownumber,
"location" from Table1;
<强>演示强>