我有这样的数据库:
ACTIONS
id day name
1 4 Bill
2 8 Susan
3 10 Bill
4 12 Bill
5 18 Susan
6 22 John
我想得到两个按名称分组的记录之间的平均天数或延迟。
带Bill计算步骤的示例
示例与Susan计算步骤
因为John只有一条记录,所以没有时间,所以它应该返回0或null,两种方法都可以。
因此,我希望编写一个查询,它执行这些计算步骤并返回以下数据集:
RESULTS
name average_days_between
Bill 4
Susan 10
John null
我能够编写一个脚本,它循环遍历每条记录,每次平均计算一条,但生成大量记录需要很长时间。
是否可以编写一个PostgreSQL查询来生成这样的结果集?
发布于 2020-09-18 17:49:56
lag()
窗口函数将为您完成此任务。如果速度太慢,则将intervals
CTE重写为子查询。
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)
https://stackoverflow.com/questions/63960472
复制相似问题