首页 > 解决方案 > 有没有办法对这些数据进行分组?

问题描述

数据看起来像 -

1
2
3
1
2
2
2
3
1
5
4
1
2

因此,只要有一个 1,它就标志着一个包含所有元素的组的开始,直到它到达下一个 1。所以在这里,

1 2 3 - group 1
1 2 2 2 3 - group 2 

等等.. 显示每个此类组的平均值的 SQL 查询是什么。

如果不使用 for 循环或 PLSQL 代码,我无法弄清楚如何对它们进行分组。

结果应该看起来像两列,一列是实际数据,第二列是平均值-

1 - avg value of 1,2 3
2
3
1 - avg value of 1,2,2,2,3
2
2
2
3
1 - avg value of 1,5,4
5
4
1 - avg value of 1,2
2

标签: sqloracle

解决方案


SQL 表表示无序集。没有排序,除非列指定排序。让我假设你有这样一个专栏。

您可以使用累积总和来识别组:

select t.*,
       sum(case when t.col = 1 then 1 else 0 end) over (order by ?) as grp
from t;

?是指定排序的列。

然后,您可以使用聚合计算平均值:

select grp, avg(col)
from (select t.*,
             sum(case when t.col = 1 then 1 else 0 end) over (order by ?) as grp
      from t
     ) t
group by grp;

推荐阅读