聚合函数

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() .前者计算整行,而后者计算非 NULLobservation 列(均按 order_date ).这是由于PostgreSQL本身如何实现 count() 功能

浇注骨料

possible to cast 聚合列或聚合本身,或同时两者。

铸造聚集柱

例如,假设 orders 具有 order_details JSON columntax_amount 钥匙我们无法相加 tax_amount 直接因为使用 ->->> 将返回数据 jsontext 格式.因此我们需要将其转换为兼容类型(例如 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 表.要得到的总和 amountname 列从 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) 总而言之 amountname

使用嵌入式资源内部的聚合

使用上一个例子中的关系,让我们获取所有 customers 并嵌入他们的 orders .如果我们也想得到总数 amountorder_dateorders ,我们将执行以下操作:

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())

将采取文化 maxmin 每个客户的订阅日期并按 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"
  }
]

备注

不支持对多点差内的聚合