首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgresSQL中数字之间的平均数量

PostgresSQL中数字之间的平均数量
EN

Stack Overflow用户
提问于 2020-09-18 17:41:45
回答 1查看 26关注 0票数 0

我有这样的数据库:

代码语言:javascript
运行
复制
ACTIONS
id   day   name
1    4     Bill
2    8     Susan
3    10    Bill
4    12    Bill
5    18    Susan
6    22    John

我想得到两个按名称分组的记录之间的平均天数或延迟。

带Bill计算步骤的示例

  1. 日10-4=6
  2. 日12-10= 2
  3. Average = 4

示例与Susan计算步骤

  1. 日18-8=10
  2. 平均值= 10

因为John只有一条记录,所以没有时间,所以它应该返回0或null,两种方法都可以。

因此,我希望编写一个查询,它执行这些计算步骤并返回以下数据集:

代码语言:javascript
运行
复制
RESULTS
name       average_days_between
Bill       4
Susan      10
John       null

我能够编写一个脚本,它循环遍历每条记录,每次平均计算一条,但生成大量记录需要很长时间。

是否可以编写一个PostgreSQL查询来生成这样的结果集?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-18 17:49:56

lag()窗口函数将为您完成此任务。如果速度太慢,则将intervals CTE重写为子查询。

代码语言:javascript
运行
复制
with actions (id, day, name) as (
  values (1, 4, 'Bill'),
         (2, 8, 'Susan'),
         (3, 10, 'Bill'),
         (4, 12, 'Bill'),
         (5, 18, 'Susan'),
         (6, 22, 'John')
), intervals as (
  select name,
         day -
           lag(day)
             over (partition by name
                       order by day) as latency
  from actions
)
select name,
       avg(latency) as avg_latency,
       count(*) as observations
  from intervals
 where latency is not null
 group by name
 order by name;

┌───────┬─────────────────────┬──────────────┐
│ name  │     avg_latency     │ observations │
├───────┼─────────────────────┼──────────────┤
│ Bill  │  4.0000000000000000 │            2 │
│ Susan │ 10.0000000000000000 │            1 │
└───────┴─────────────────────┴──────────────┘
(2 rows)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63960472

复制
相关文章

相似问题

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