sql - 有没有办法对这些数据进行分组?
问题描述
数据看起来像 -
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
解决方案
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;
推荐阅读
- nodes - 当不允许安装graphviz或pydotplus时,有没有办法查看决策树中数据分类的节点顺序?
- drupal - D8 - 如何访问节点主体内的自定义块?
- python - 在 url 中使用类别 slug 而不是 pk
- mysql - 如何获得第二次购买的平均值?
- mongodb - mongodb,如何在查询中使用 $not 过滤器
- design-patterns - 现有代码的设计问题(要执行的操作的初始化)
- sql - sql中的any和all子句有什么区别?
- python - 执行python脚本的批处理文件
- python - 如何在二分布局中创建非二分图
- version - 将 pine 脚本版本 4 代码转换为低于 4 的版本?