在Oracle SQL中对数据集进行分组
我一直在尝试将存储在oracle数据库中的数据分组,以便进行更准确的分析在Oracle SQL中对数据集进行分组,sql,oracle,oracle11g,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
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来分配值,但是我只能一直使用increment,而不仅仅是在更改时。我也尝试过使用滞后,但我很难利用它
我只需要第二列中的值从1开始,并在字段1的第一个字母更改时递增(使用substr)
这是我尝试使用的行数,但我想我离这很远。输出中也会有一个时间列,上面没有显示
select event_time, st_location, Row_Number() over(partition by
SUBSTR(location,1,1) order
by event_time)
as groupnumber from pic
任何帮助都将不胜感激
编辑:
演示
这是一个缺口和孤岛问题。使用以下代码:
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
列后,剩下的就很简单了。如何指定这些行的顺序?订单上还有其他栏目吗?请将其添加到您的示例中。最初有两列,分别是事件时间和地点,我想添加第三列。编辑原始帖子。将样本数据与其他列一起添加到事件时间、st\u位置
我想我现在已经这样做了?这对第一个表非常有效。我刚刚做了一个编辑,在那里我给出了第二种类型的位置,我也需要这样做。为什么在两个位置之间存在冲突时它不起作用?还是因为变化值(A&S)的大小不再一致?@JamesPavett该解决方案不正确,因为它没有隔离连续序列…只是想弄清楚它是如何工作的,因为它与另一个答案类似,但我似乎无法根据位置的情况对其进行修改。只是现在尝试一下,但我相信不管怎样,这实际上都是可行的。@JamesPavett正如我所说,问题的核心是一个经典的缺口和岛屿问题(它甚至在SO中有一个标签)。尝试使用此标签搜索其他问题,它可能会帮助您理解我的解决方案。
select DENSE_RANK() over(partition by SUBSTR("location",1,1) ORDER BY SUBSTR("location",1,2))
as Rownumber,
"location" from Table1;
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