按不同的时间范围按非唯一键对数据进行分组

Sre*_*ree 6 oracle group-by gaps-and-islands

我在 Oracle 表中有如下数据:

PROJ_NBR     STATUS    START_DT        
AL20         AC        1/14/2010 4:31        
AL20         AC        1/14/2010 4:32        
AL20         AC        1/14/2010 4:32        
AL20         DE        1/14/2010 4:34        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         DE        1/14/2010 4:46        
AL20         AC        3/4/2010 4:31        
AL20         AC        3/4/2010 4:39        
AL20         AC        3/21/2010 13:24        
AL20         AC        2/4/2011 13:54        --year changes here
AL20         AC        2/4/2011 14:14        
AL20         AC        2/4/2011 14:27        
AL20         DE        2/11/2011 16:24        
Run Code Online (Sandbox Code Playgroud)

我们的表有 2,091,348 行。

我想要如下数据...

PROJ_NBR     STATUS    BEGIN                END
AL20         AC        1/14/2010 4:31       1/14/2010 4:32
AL20         DE        1/14/2010 4:34       1/14/2010 4:46
AL20         AC        3/4/2010 4:31        2/4/2011 14:27  --Second time range for AL20, AC
AL20         DE        2/11/2011 16:24      2/11/2011 16:24
Run Code Online (Sandbox Code Playgroud)

Gai*_*ius 0

SELECT PROJ_NBR, STATUS, MIN(START_DT) AS _BEGIN, MAX(START_DT) AS _END 
FROM MYTABLE GROUP BY PROJ_NBR, STATUS;
Run Code Online (Sandbox Code Playgroud)

为什么 _?因为BEGINEND是保留字。

  • 这是我最初的想法,但我认为这还不够。所需的输出有两个不同的行,其中 PROJ_NBR 为 AL20,STATUS 为 AC。简单的 GROUP BY 将返回一个这样的行,其开始日期为 1/14/2010,结束日期为 2/4/2011。我相信我们将需要分析来检测从一种状态到另一种状态的变化。 (3认同)
  • Justin 是对的,我相信他需要一个序列列,该序列列将在状态更改时重置,并按该特定序列获取组数据,而不仅仅是按 proj_nbr 和状态分组。 (2认同)