在Oracle SQL中对数据集进行分组

时间:2018-04-11 10:32:03

标签: sql oracle oracle11g

我一直试图将存储在我的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

2 个答案:

答案 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

dbfiddle demo

主要思想是在子查询中隔离连续的项目序列(计算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;

<强>演示

  

http://sqlfiddle.com/#!4/21120/16