首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用解析函数时的分组

使用解析函数时的分组
EN

Stack Overflow用户
提问于 2020-07-17 01:12:47
回答 1查看 35关注 0票数 2

假设我们有一个如下所示的表:

代码语言:javascript
复制
Level|Depth|Descrip|  
  0  |  0  | Base    |  
  1  |  50 | Level_1 |  
  2  |  53 | Level_2 |  
  3  |  60 | Level_3 |  
  8  |  80 | Level_8 |  
  10 |  81 | Level_10|    
  15 | 101 | Level_15|  
  16 | 102 | Level_16|  
  17 | 102 | Level_16_bis|  
  18 | 103 | Level_17|  

首先,我需要获得表示有意义(超过15个mts)深度跳跃的行,而不是前面的行。我让这些行这样做:

代码语言:javascript
复制
Select level,depth, descrip from(
    Select level
    , depth
    ,lag(depth) over (order by level asc) as prev_depth
    , descrip
    from ground_levels
    )
Where abs(depth-prev_depth) > 15 and depth > 0 

它给了我一个这样的表:

代码语言:javascript
复制
Level|Depth|Descrip|  
  1  | 50  | Level_1|  
  8  | 80  | Level_8|  
 15  | 101 | Level_15|

现在,我需要收集跳跃之间的级别。所以,我需要这样的东西:

代码语言:javascript
复制
Level|Depth| Descrip | Equivalent_levels |  
  1  | 50  | Level_1 |     2,3           |  
  8  | 80  | Level_8 |     10            |  
 15  | 101 | Level_15|     16,17,18      |  

我已经做了一些关于使用"listagg",rank()和其他分析函数的搜索,但我坚持使用脚本:(

此外,如果我可以在满足以下条件时开始分组,那就太好了: abs(depth-prev_depth) > 15,这样我就可以得到如下内容:

代码语言:javascript
复制
Level|Depth|Descrip  | Group_ID   
  1  |  50 | Level_1 |  1  |  
  2  |  53 | Level_2 |  1  |  
  3  |  60 | Level_3 |  1  |  
  8  |  80 | Level_8 |  2  |  
  10 |  81 | Level_10|  2  |  
  15 | 101 | Level_15|  3  |  
  16 | 102 | Level_16|  3  |  
  17 | 102 | Level_16_bis| 3  |   
  18 | 103 | Level_17|   3   |  

有什么想法吗?

附言:对不起,我的英语不好……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-17 01:19:07

您可以使用累计和来定义组。然后聚合:

代码语言:javascript
复制
Select min(level) as level,
       min(depth) keep (dense_rank first order by level) as depth,
       min(descrip) keep (dense_rank first order by level) as descrip,
       list_agg(level, ',') within group (order by level) as levels
from (select gl.*,
             sum(case when abs(prev_depth - depth) > 15 and depth > 0 then 1 else 0 end) over (order by level) as grp
      from (select gl.*, lag(depth) over (order by level asc) as prev_depth
            from ground_levels
           ) gl
     ) gl
group grp;

这实际上保持了列表中的起始级。它可以被移除,但这需要更多的工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62940035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档