使用分析函数时的sql分组

c9qzyr3d  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(472)

假设我们有一张这样的table:

  1. Level|Depth|Descrip|
  2. 0 | 0 | Base |
  3. 1 | 50 | Level_1 |
  4. 2 | 53 | Level_2 |
  5. 3 | 60 | Level_3 |
  6. 8 | 80 | Level_8 |
  7. 10 | 81 | Level_10|
  8. 15 | 101 | Level_15|
  9. 16 | 102 | Level_16|
  10. 17 | 102 | Level_16_bis|
  11. 18 | 103 | Level_17|

首先,我需要得到表示有意义(超过15 mts)深度跳跃的行。我让那些行做这样的事情:

  1. Select level,depth, descrip from(
  2. Select level
  3. , depth
  4. ,lag(depth) over (order by level asc) as prev_depth
  5. , descrip
  6. from ground_levels
  7. )
  8. Where abs(depth-prev_depth) > 15 and depth > 0

给我一张这样的table:

  1. Level|Depth|Descrip|
  2. 1 | 50 | Level_1|
  3. 8 | 80 | Level_8|
  4. 15 | 101 | Level_15|

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

  1. Level|Depth| Descrip | Equivalent_levels |
  2. 1 | 50 | Level_1 | 2,3 |
  3. 8 | 80 | Level_8 | 10 |
  4. 15 | 101 | Level_15| 16,17,18 |

我一直在搜索如何使用“listag”、rank()和其他分析函数,但我还是坚持使用脚本:(
此外,如果我能在满足以下条件时开始分组,那就太好了:abs(depth-prev\u depth)>15,这样我就可以得到这样的结果:

  1. Level|Depth|Descrip | Group_ID
  2. 1 | 50 | Level_1 | 1 |
  3. 2 | 53 | Level_2 | 1 |
  4. 3 | 60 | Level_3 | 1 |
  5. 8 | 80 | Level_8 | 2 |
  6. 10 | 81 | Level_10| 2 |
  7. 15 | 101 | Level_15| 3 |
  8. 16 | 102 | Level_16| 3 |
  9. 17 | 102 | Level_16_bis| 3 |
  10. 18 | 103 | Level_17| 3 |

有什么想法吗??
p、 s:对不起,我的英语不好。。。

aydmsdu9

aydmsdu91#

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

  1. Select min(level) as level,
  2. min(depth) keep (dense_rank first order by level) as depth,
  3. min(descrip) keep (dense_rank first order by level) as descrip,
  4. list_agg(level, ',') within group (order by level) as levels
  5. from (select gl.*,
  6. sum(case when abs(prev_depth - depth) > 15 and depth > 0 then 1 else 0 end) over (order by level) as grp
  7. from (select gl.*, lag(depth) over (order by level asc) as prev_depth
  8. from ground_levels
  9. ) gl
  10. ) gl
  11. group grp;

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

相关问题