社交网络上有一个帖子表,上面有出版物的日期和标题.

id created_at title
1 2022-01-17 08:50:58 Sberbank is the best bank
2 2022-01-17 18:36:41 Visa vs MasterCard
3 2022-01-17 16:16:17 Visa vs UnionPay
4 2022-01-17 18:01:00 Mastercard vs UnionPay
5 2022-01-16 16:44:36 Hadoop or Greenplum: pros and cons
6 2022-01-16 14:57:32 NFC: wireless payment

我需要计算每月的出版物数量,显示每月的第一个日期和百分比 与上个月相比,员额(出版物)的数量有所增加.结果表中的数据应按时间顺序排列.消息数量增加的百分比可以是负数,结果应该是 加上%符号,四舍五入到小数点后一位.

表结果

dt count prent_growth
2022-02-01 175 null
2022-03-01 338 93.1%
2022-04-01 345 2.1%
2022-05-01 295 -14.5%
2022-06-01 330 11.9%

我看了文档,但我不知道该怎么做.

推荐答案

step-by-step demo: db<>fiddle

SELECT 
    *,
    (count * 100 / prev_count - 100)::text || '%'                 -- 4
FROM (
    SELECT
        *,
        lag(count) OVER (ORDER BY pub_month) as prev_count        -- 3
    FROM (
        SELECT
            date_trunc('month', pub_date)::date as pub_month,     -- 1
            COUNT(*)                                              -- 2
        FROM mytable
        GROUP BY 1
    ) s
) s
  1. 将所有日期规格化为每月的第一天(如果您愿意,可以"截断"日期部分)
  2. 对所有归一化日期进行分组,并按归一化日期/月计算所有条目
  3. 使用lag() window function将上一个计数结果移到当前行.现在您可以直接比较上个月和本月的月数
  4. 计算百分比.结果是数字类型.所以可以把它铸成text字,然后再加上百分比字符.

Postgresql相关问答推荐

当通过PostgreSQL FDW中的视图使用时,年龄函数的计算方式不同

如何诊断字符编码问题

在特定距离内创建点的唯一索引

至少 pgRouting 的某些部分可以与并行查询并行运行吗?

如何在 MockDataProvider 中创建自定义 JOOQ 记录?

PostgreSQL - 如何获得前一个月和一周的价值?

Heroku Rails 4 无法连接到服务器:connection refused

postgresql查询中的正则表达式不区分大小写

PostgreSQL:是否可以将枚举转换为整数?

在postgresql中按经纬度查找最近的位置

Postgres 中的相似函数与 pg_trgm

在PostgreSQL中 Select 数组列的总和

如何将参数值添加到 pgadmin sql 查询?

SQL Select 一列中具有重复值的所有行

NOT LIKE 带有 NULL 值的行为

postgresql 查询以显示用户的组

在 Postgresql 中按窗口函数结果过滤

如何使用 sql 或 phpPgAdmin 更改 PostgreSQL 数据库的数据库编码?

Rails + Postgres fe_sendauth:no password supplied

Android 的 JDBC 与 Web 服务