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

如何在PARTITION BY中使用WHERE?SQL同名称行非空消息分组计数实现问询

解决你的SQL窗口函数计数问题

嘿,你的需求很明确——要给每个name分组统计非null的message数量,并且同一name下的所有行都显示这个统一的计数对吧?原代码里的问题在于窗口函数的OVER子句没法直接用WHERE做过滤,得换个正确的写法。

这里有两种靠谱的解决方案,适配不同的数据库环境:

通用写法(支持大多数SQL数据库)

用CASE表达式配合count()来实现,因为count()会自动忽略null值,我们只在message非null时返回一个有效值,其他情况返回null,这样就能精准统计符合条件的记录数:

select *, 
       count(case when message is not null then 1 end) over (partition by name) as "mes_count"
from messages;

简洁写法(适用于支持FILTER子句的数据库)

如果你的数据库支持FILTER子句(比如PostgreSQL、BigQuery、Redshift等),可以用更直观的语法直接在窗口函数里筛选需要计数的行:

select *, 
       count(*) over (partition by name) filter (where message is not null) as "mes_count"
from messages;

这两种写法都能达到你的要求:同一name的所有行对应的mes_count值完全一致,且只统计message不为null的记录。你可以根据自己使用的数据库类型选择合适的版本~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:42:52