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

如何查询TITLE重复的SQL结果?窗口函数WHERE过滤报错求助

解决窗口函数无法在WHERE子句中使用的问题

这个问题我之前也碰到过!PostgreSQL确实不允许在WHERE子句里直接使用窗口函数,核心原因是SQL的执行顺序:WHERE和FROM子句会先执行,而窗口函数是在这些步骤之后才计算的,所以WHERE阶段根本拿不到PPP这个窗口函数的计算结果,自然会报错。

要实现你筛选PPP > 1记录的需求,我们可以通过子查询或者**CTE(公共表表达式)**先计算出窗口函数的结果,再在外层查询中进行过滤。下面是两种可行的方案:

方案一:使用子查询

SELECT AAA, BBB, CCC, PPP
FROM (
    -- 先在内层计算窗口函数结果
    SELECT AAA, BBB, CCC, 
           count(*) OVER (PARTITION BY TITLE) AS PPP 
    FROM my_tabel 
    WHERE AAA IS NOT NULL AND BBB = 'SOMETHING'
) AS filtered_data
-- 在外层筛选PPP大于1的记录
WHERE PPP > 1;

方案二:使用CTE(可读性更好)

如果你希望代码结构更清晰,可以用CTE来拆分逻辑:

WITH title_counts AS (
    SELECT AAA, BBB, CCC, 
           count(*) OVER (PARTITION BY TITLE) AS PPP 
    FROM my_tabel 
    WHERE AAA IS NOT NULL AND BBB = 'SOMETHING'
)
SELECT AAA, BBB, CCC, PPP
FROM title_counts
WHERE PPP > 1;

这两种方式的本质都是先完成窗口函数的计算,得到包含PPP的中间结果集,再通过外层查询的WHERE条件筛选出符合要求的记录,完美避开了窗口函数不能直接用在WHERE中的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:35:00