我使用的是SQL Server2012,并try 在包含两列(id和time)的数据集上计算一些聚合函数和百分位数.在我的研究中,我找到了一些解决方案,但它们对我不起作用(可能是因为我的SQL版本过时了)

id time_seconds
1 120
2 10
3 50
4 80
5 60
6 42
7 96

我会试一试这样的东西:

SELECT 
    MIN(time_seconds) AS min,
    MAX(time_seconds) AS max,
    PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY time_seconds) OVER () AS '95 percentil'
from table 

如果我运行这个查询,它希望我在Group by中创建一个INCLUDE"Time_Second",但是聚合函数就不再起作用了.

Id希望成为的输出如下所示:

min max 95 percentil
10 120 110

谢谢你的帮忙!

推荐答案

遗憾的是,PERCENTILE_CONT只能用作窗口函数,而不能用作聚合函数.这是一个(罕见的) case ,select distinct可能会派上用场:

select distinct
    min(time_seconds) over() as min_time_seconds,
    max(time_seconds) over() as max_time_seconds,
    percentile_cont(0.95) within group (order by time_seconds) over () as percentil_95
from mytable 

基本上,这与问题相反:因为我们不能进行百分位数的聚合计算,所以我们将其他聚合函数转换为窗口函数:窗口计算在所有行上产生相同的值,因此我们可以使用distinct对结果集进行重复数据删除.

min_time_seconds max_time_seconds percentil_95
10 120 112.8

fiddle-这是SQL Server 2014,因为db<;>;fiddle不支持2012.

Sql相关问答推荐

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

如何实现一个广泛的多级自连接PostgreSQL查询?

在SQL中将相同且紧挨着的元素进行分组

在请求结束之前,PostgreSQL不会考虑使用中的删除

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

如何从JSON数组中 Select 多个值

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

替换上一个或下一个值中的空值并添加其价格日期

在SELECT中将日期格式转换为双周时段

通过对象分离实现原子性

用于SQL协助的XQUERY()

违反了完整性约束-值存在时找不到父键

使用特定的Order By子句随机化SQL输出

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

显示所有组并计算给定组中的项目(包括 0 个结果)

日期逻辑(查找过go 90 天内的第一个匹配行)

如何在sparksql查询中使用日期值?

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

如何比较同一张表中的行并进行相应更新

如何优化sql请求?