聚合函数
PostgREST支持以下聚合函数: avg()
, count()
, max()
, min()
,以及 sum()
。请参阅 section on aggregate functions in the PostgreSQL documentation 有关这些功能的详细说明,请参阅。
备注
聚合函数 disabled 默认情况下,在Postgrest中,因为它们可能会在没有适当的保护措施的情况下造成性能问题。看到 数据库-已启用聚合 了解详情。
要使用聚合函数,请将其附加到 select
参数,这样:
curl "http://localhost:3000/orders?select=amount.sum()"
这将返回 sum
在所有价值观中 amount
一行中的列:
[
{
"sum": 1234.56
}
]
你可以 select
同时使用多个聚合函数(您可能需要 rename them 消除歧义)。
curl "http://localhost:3000/orders?select=total_amount:amount.sum(),avg_amount:amount.avg(),total_quantity:quantity.sum()"
备注
聚合函数与其他PostgREST功能一起工作,如 水平滤波 , JSON列 ,而且 有序化 .然而,它们不兼容 域表示法 目前。此外,PostgreSQL的 HAVING
目前尚不支持分句和按聚合列排序。
自动 GROUP BY
在SQL中, GROUP BY
需要Clause来聚合所选列。但是,如果列已经存在于 select
参数.例如:
curl "http://localhost:3000/orders?select=amount.sum(),amount.avg(),order_date"
这将获得按中每个唯一值分组的金额的总和和平均值 order_date
色谱柱:
[
{
"sum": 1234.56,
"avg": 123.45,
"order_date": "2023-01-01"
},
{
"sum": 2345.67,
"avg": 234.56,
"order_date": "2023-01-02"
}
]
的 count()
骨料
备注
在添加聚合函数之前,可以通过添加来计数 count
(不含括号)到 select
参数.虽然这仍然受到支持,但将来可能会被废弃,因此使用此遗留功能 not recommended .请使用 count()
(with括号)代替。
count()
是一种特殊情况,因为它可以与或不与聚合列一起使用。例如:
curl "http://localhost:3000/orders?select=count(),observation_count:observation.count(),order_date"
[
{
"count": 4,
"observation_count": 2,
"order_date": "2023-01-01"
},
{
"count": 2,
"observation_count": 1,
"order_date": "2023-01-02"
}
]
请注意,结果之间存在差异 count()
和 observation.count()
.前者计算整行,而后者计算非 NULL
值 observation
列(均按 order_date
).这是由于PostgreSQL本身如何实现 count()
功能
浇注骨料
是 possible to cast 聚合列或聚合本身,或同时两者。
铸造聚集柱
例如,假设 orders
具有 order_details
JSON column 与 tax_amount
钥匙我们无法相加 tax_amount
直接因为使用 ->
或 ->>
将返回数据 json
或 text
格式.因此我们需要将其转换为兼容类型(例如 numeric
)就在聚合函数之前:
curl "http://localhost:3000/orders?select=order_details->tax_amount::numeric.sum()"
[
{
"sum": 1234.56
}
]
铸造集料
例如,如果我们想对平均值进行四舍五入 amount
专栏,我们可以通过选角来做到这一点 avg()
到 int
:
curl "http://localhost:3000/orders?select=amount.avg()::int"
[
{
"avg": 201
}
]
聚合和资源嵌入
您可以通过 embedded resource 并且还使用其中的聚集体。
由嵌入式资源卸载
与按列分组类似,聚合功能也可以按嵌入式资源分组。例如,假设 orders
表与a相关 customers
表.要得到的总和 amount
按 name
列从 customers
表中,我们将执行以下操作:
curl "http://localhost:3000/orders?select=amount.sum(),customers(name)"
[
{
"sum": 100,
"customers": {
"name": "Customer A"
}
},
{
"sum": 200,
"customers": {
"name": "Customer B"
}
}
]
前面的示例使用“对一”关系,但这也可以在“对多”关系上完成(尽管几乎没有明显的用例)。
这也以类似的方式适用于 spread embedded resources .例如, select=amount.sum(),...customers(name)
总而言之 amount
按 name
柱
使用嵌入式资源内部的聚合
使用上一个例子中的关系,让我们获取所有 customers
并嵌入他们的 orders
.如果我们也想得到总数 amount
按 order_date
的 orders
,我们将执行以下操作:
curl "http://localhost:3000/customers?select=name,city,state,orders(amount.sum(),order_date)"
[
{
"name": "Customer A",
"city": "New York",
"state": "NY",
"orders": [
{
"sum": 215.22,
"order_date": "2023-09-01"
},
{
"sum": 905.73,
"order_date": "2023-09-02"
}
]
},
{
"name": "Customer B",
"city": "Los Angeles",
"state": "CA",
"orders": [
{
"sum": 329.71,
"order_date": "2023-09-01"
},
{
"sum": 425.87,
"order_date": "2023-09-03"
}
]
}
]
请注意,聚合是在嵌入式资源中完成的 orders
.它不受顶层关系中任何列的影响 customers
.
对一点差中的总计
a内的所有聚集体 one-to-one or many-to-one spread embedded resource 将被提升到顶层关系。换句话说,它的表现就好像聚合是在顶层关系本身中完成的。例如:
curl "http://localhost:3000/orders?select=order_date,...customers(subscription_date.max(),subscription_date.min())
将采取文化 max
和 min
每个客户的订阅日期并按 order_date
色谱柱:
[
{
"order_date": "2023-11-01",
"max": "2023-10-15",
"min": "2013-10-01"
},
{
"order_date": "2023-11-02",
"max": "2023-10-30",
"min": "2016-02-11"
}
]
备注
不支持对多点差内的聚合