如何查询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
相关产品推荐
相关产品推荐

