You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL计算指定时间区间内记录占总数的百分比

计算指定时间区间记录占总记录的百分比(使用OVER()窗口函数)

嘿,这个需求用OVER()窗口函数完全能轻松实现,而且写法相当简洁!我来给你拆解一下思路和具体实现:

核心思路

我们需要两个关键数值:

  1. 符合指定时间区间的记录数量
  2. 表的总记录数量

用OVER()窗口函数可以直接在同一查询中获取总记录数,不需要额外的子查询或者JOIN,效率很高。

具体SQL实现

假设你的表名为your_table,对应的SQL语句如下:

SELECT
  ROUND(
    (COUNT(CASE WHEN created_at BETWEEN '2019-04-28 00:00:00' AND '2019-04-30 00:00:00' THEN 1 END) * 100.0)
    / COUNT(*) OVER(),
    2
  ) AS interval_record_percentage
FROM your_table;

代码解释

  • COUNT(CASE WHEN ... THEN 1 END):通过CASE表达式筛选出时间在目标区间内的记录,符合条件的返回1,不符合的返回NULL;COUNT函数会忽略NULL值,所以这个部分得到的就是目标区间内的记录总数。
  • COUNT(*) OVER():这里OVER()没有指定分区条件(PARTITION BY),所以它会计算整个表的总记录数,作为窗口结果和每条记录关联(不过我们这里是聚合查询,最终只会返回一行结果)。
  • * 100.0:把小数形式的占比转换成百分比格式(用100.0而不是100是为了确保除法运算得到浮点数,避免整数除法截断)。
  • ROUND(..., 2):将结果保留两位小数,你可以根据需求调整保留的位数,比如要整数的话改成ROUND(..., 0)。

验证你的示例数据

你的示例表有4条记录,其中first(2019-04-29)和third(2019-04-28)符合区间条件,代入计算就是:
(2 * 100.0) / 4 = 50.00,正好得到你期望的50%结果。

额外小提示

如果担心时间精度问题(比如created_at包含毫秒级数据),可以把时间条件写成更严谨的形式:

created_at >= '2019-04-28' AND created_at < '2019-05-01'

这样会包含2019-04-28 00:00:00到2019-04-30 23:59:59.999...的所有记录,避免因为时间戳的毫秒部分导致漏判。

内容的提问来源于stack exchange,提问作者Sergii Bishyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:09:07