我有一个专栏,所有数字都称为id.我想知道两个身份证的差值的中位数.例如,如果ID(升序排序)是[1,5,30,35],则差值将是[4,25,5]和中位数.会是5美元.

我试过了

SELECT id - LAG(id) OVER (order by id) FROM `table` ORDER BY id ASC

这就产生了一系列的差异.然而,如果我try

SELECT AVG(id - LAG(id) OVER (order by id)) FROM `table` ORDER BY id ASC

或者中值为PERCENTILE_CONT(x, 0.5),则我得到一个错误,说明分析函数不能是聚合函数的参数.我怎么才能解决这个问题?

谢谢!

推荐答案

您不能像那样将窗口函数和聚合函数混合在一起.您需要使用lag() in a subquery,然后在外部查询中聚合:

select avg(id - lag_id) avg_id_diff
from (
    select id, lag(id) over(order by id) lag_id
    from mytable 
) t

如果你要找的是中位数的差值,而不是平均值:

select percentile_cont(id - lag_id, 0.5) over() mediam_id_diff
from (
    select id, lag(id) over(order by id) lag_id
    from mytable 
) t
limit 1

percentile_cont只能用作窗口函数(不能用作聚合函数),这就是我们使用over()limit子句的原因.

Sql相关问答推荐

使用Mac日志(log)时间找出SQL中的好小时和坏小时

在Golang中管理数据库事务的简洁方法

如何使用ROW_NUM() Select 一个没有第二条记录的实例?

SQL基于多个值 Select 单行

SQL将 Select 查询作为新列添加到另一个 Select 查询

SQL:如何在表中同时使用GROUPING和CONDITION?

无法将发票与产品价格相关联

Oracle PL/SQL:解决DBMS输出大小限制的问题

最小非重复集的SQL查询

使用多个WITH子查询的替代方法

Select 最频繁的值以及分组依据

将 json 列键映射到第二个表中的匹配列值

SQL Select 字母范围没有给我任何东西

SQL for Smarties 类型问题:从表中 Select 记录,并对某些值进行分组

删除重复记录但保留最新的SQL查询

SQL中如何转置表格 UNPIVOT是唯一的 Select 吗?

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

为每组填写行以进行旋转