📜  postgres 以 10 分钟为间隔分组 (1)

📅  最后修改于: 2023-12-03 15:33:44.345000             🧑  作者: Mango

分组 Postgres 数据库中的数据

如果你需要对 postgres 数据库的数据进行分组,你可以使用 postgres 提供的 GROUP BY 语句。通过使用 GROUP BY,你可以将数据按照特定的列进行分组,并对这些分组进行聚合操作,如计数、求和、平均数等。

语法

GROUP BY 语句的语法如下:

SELECT column1, column2, …
FROM table_name
GROUP BY column1, column2, …

其中,column1column2 等表示要按照哪些列进行分组,table_name 表示要进行分组的数据表。

示例

假设有一张 employee 表,其中包含员工的姓名、所在部门和工资等信息,现在需要按照部门对员工进行分组,并分别计算每个部门的员工数目和平均工资:

SELECT department, COUNT(*), AVG(salary)
FROM employee
GROUP BY department;

执行以上 SQL 语句后,可以得到类似如下的结果:

 department | count |          avg          
------------+-------+----------------------
      Sales |     2 | 1750.0000000000000000
        IT |     3 | 3700.0000000000000000
     Finance |     2 | 2500.0000000000000000

以上结果表示 Sales 部门共有两名员工,平均工资为 1750 元,IT 部门共有三名员工,平均工资为 3700 元,Finance 部门共有两名员工,平均工资为 2500 元。

以 10 分钟为间隔分组

如果需要按照时间进行分组,例如以 10 分钟为间隔进行分组,可以通过将时间字段按照一定的算法转换成整数或者字符串类型,然后再使用 GROUP BY 进行分组,例如:

SELECT DATE_TRUNC('minute', created_at - INTERVAL '1 hour') || ':' ||
       TO_CHAR(DATE_TRUNC('minute', created_at - INTERVAL '1 hour'), 'MI') AS interval,
       COUNT(*),
       AVG(price)
FROM sales
GROUP BY interval;

其中,DATE_TRUNC 是 postgres 内置函数,可以将时间戳截取到某一个精度级别(这里是分钟级别);TO_CHAR 可以将时间戳转换成字符串类型,这里是将分钟转换成字符串类型并拼接到小时中。

执行以上 SQL 语句后,可以得到类似如下的结果:

        interval         | count |                 avg                 
-------------------------+-------+-------------------------------------
 2021-12-01 00:00:00:00 |     3 | 6.6666666666666667
 2021-12-01 00:10:00:00 |     5 | 8.4000000000000000
 2021-12-01 00:20:00:00 |     4 | 4.7500000000000000

以上结果表示,以每 10 分钟为一个间隔,第一个间隔(00:00:00~00:09:59)有 3 笔销售记录,销售额平均为 6.67 元;第二个间隔(00:10:00~00:19:59)有 5 笔销售记录,销售额平均为 8.40 元;第三个间隔(00:20:00~00:29:59)有 4 笔销售记录,销售额平均为 4.75 元。

综上,GROUP BY 是 postgres 中非常重要的语法之一,能够方便地对数据进行分组和聚合操作,可以用于各种数据分析和报表生成场景。