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

无分组表查询最新日期行 不使用WHERE子句适配物化视图REFRESH CONCURRENTLY

可行实现方案

以下两种方案都完全不使用WHERE子句,返回结果和你原有SQL逻辑完全一致,同时满足PostgreSQL物化视图REFRESH CONCURRENTLY的语法要求:


方案1:内连接关联最大日期结果(兼容所有PostgreSQL版本)

将过滤逻辑迁移到JOIN的ON子句中,不需要额外写WHERE过滤:

SELECT t1.*
FROM table1 t1
INNER JOIN (
    SELECT MAX(date1) AS max_date FROM table1
) t_max ON t1.date1 = t_max.max_date

方案2:窗口函数+QUALIFY子句(PostgreSQL 13及以上版本支持)

使用专门用于窗口函数结果过滤的QUALIFY语法,写法更简洁:

SELECT *
FROM table1
QUALIFY date1 = MAX(date1) OVER ()

支持并发刷新的额外配置

要让物化视图支持REFRESH CONCURRENTLY,需要额外完成配置:

  • 基于上述语句创建物化视图
  • 为物化视图创建覆盖唯一标识字段的唯一索引,示例如下:
-- 创建物化视图(以方案1为例)
CREATE MATERIALIZED VIEW mv_latest_table1 AS
SELECT t1.*
FROM table1 t1
INNER JOIN (
    SELECT MAX(date1) AS max_date FROM table1
) t_max ON t1.date1 = t_max.max_date;

-- 创建唯一索引,示例使用table1的主键id作为唯一标识
CREATE UNIQUE INDEX idx_mv_latest_table1_pkey ON mv_latest_table1(id);

配置完成后即可执行REFRESH CONCURRENTLY mv_latest_table1;完成并发刷新。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:21:03