数据库存储以下格式的表:

Parent name Start End Value
PN1 12 16 2
PN1 19 29 4
PN1 32 34 6
... ... ... ...
PN2 4 17 3
PN2 32 33 6
... ... ... ...

是否可以通过根据段长度条件分组来计算平均值?

那是如果段的长度是30.重新分类的表格如下:

Parent name Avg
PN1 (2+4)/2
PN1 6/1
... ...
PN2 3/1
PN2 6/1
... ...

现在我不考虑段的值可能与单元格中的值重叠的情况.

事实上,分组的任务是找到一种方法来"折叠"这些值.

推荐答案

您可以使用floor()函数对"End"值下的whole segments进行分组.如果你的段长度是integer,它与ceil()nothing一样,因为除以int会导致小数点后的所有内容被截断:

numeric_type / numeric_type → numeric_type
Division (for integral types, division truncates the result towards zero)

Demo at db<>fiddle:

select "Parent name"
      ,avg(value)
      ,format( '(%s)/%s'
              ,string_agg(value::text,'+')
              ,count(*)) as calculation
from your_table
group by "Parent name", floor("End"/30)::int
order by "Parent name", max("End");
Parent name avg calculation
PN1 3.0000000000000000 (2+4)/2
PN1 6.0000000000000000 (6)/1
PN2 3.0000000000000000 (3)/1
PN2 6.0000000000000000 (6)/1

Sql相关问答推荐

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

从列的不同值创建列

如何在联接条件不匹配时按日期获取上一条记录

为什么在这种情况下我不能使用LAG函数?

从日期开始向前填充重复项

如果元素包含通过SQL指定的字符串,则过滤掉数组元素

SQL:计算与另一列中给定值互斥的匹配项

snowflake/SQL嵌套的JSON对象和数组

用户购买平台及金额统计

Pgsql-返回包含多行数据的行

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

GRAFANA 数据库查询错误:pq:列名称不存在

在SQL中实现表格数据透视类型报表

如何从一张表中获取值在至少三行相同的记录

比使用NOT EXISTS更高效的SQL删除方法是什么?

HIVE SQL where 子句未按预期工作

如何仅在满足条件时才按顺序在 SQL 中计数?

在 BigQuery 数据集中查找表大小和占总数据集大小的百分比

如何根据 Amazon Athena 中的多个列值删除重复行?