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

PostgreSQL查询报错relation c1不存在 如何获取各月10条随机记录

报错原因

你遇到的relation "c1" does not exist报错是因为LEFT JOIN后的子查询C3属于独立子查询,无法直接引用外层查询中C1表的C1.month字段,属于通用SQL语法限制,不是混用MySQL语法导致。
同时你的原有逻辑冗余,不需要额外做关联查询就能实现需求。

修正方案

你已经在CTE中用ROW_NUMBER()窗口函数按月份分组、随机排序生成了行号,直接过滤行号≤10即可实现每个月提取10条随机记录的需求。

优化后可运行代码

WITH CTE AS 
(
    SELECT  
        month, 
        email, 
        ROW_NUMBER() OVER (PARTITION BY month ORDER BY RANDOM()) AS RN
    FROM (
        SELECT
            DISTINCT TO_CHAR(DATE_TRUNC('month', "timestamp"), 'YYYY-MM') AS month,
            CASE
                WHEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'name') = 'email' 
                THEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'value')
            END AS email
        FROM form_submits_y2 fs
        WHERE fs.website_id = 791
            -- 筛选2021年数据
            AND EXTRACT(YEAR FROM "timestamp") = 2021
            -- 排除未结束的12月
            AND EXTRACT(MONTH FROM "timestamp") < 12
            -- 过滤空邮箱无效记录
            AND CASE
                WHEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'name') = 'email' 
                THEN JSON_EXTRACT_PATH_TEXT(json_extract_array_element_text(form_data,0),'value')
            END IS NOT NULL
        GROUP BY 1,2
    ) t
)
SELECT month AS "Month", email AS "Another header"
FROM CTE
WHERE RN <= 10
ORDER BY month ASC

调整说明

  • 删除了冗余的LEFT JOIN逻辑,彻底解决原报错问题,执行效率也更高
  • 调整了年份、月份的过滤逻辑,直接操作原始时间字段,避免部分数据库不支持WHERE子句引用SELECT别名的问题
  • 新增空邮箱过滤,避免返回无邮箱的无效记录
  • 输出字段名对齐你要求的表头格式,不需要额外处理即可匹配预期输出

如果使用的是MySQL数据库,需要做两处适配:将RANDOM()替换为RAND(),同时替换对应JSON解析函数为MySQL的JSON操作语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:03