代码之家  ›  专栏  ›  技术社区  ›  James Pavett

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

  •  4
  • James Pavett  · 技术社区  · 6 年前

    我一直在尝试将存储在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\u编号,但我认为这离我很远。输出中也会有一个上面没有显示的时间列。

    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 回复  |  直到 6 年前
        1
  •  3
  •   Radim Bača    6 年前

    这是一个缺口和孤岛问题。使用以下代码:

    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 列)。剩下的就很简单了 玻璃钢

        2
  •  1
  •   Jay Shankar Gupta    6 年前
    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