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

SQL如何统计每个用户当前评论之前的历史评论数量

问题背景

现有基础表base_table结构及样例数据如下:

date      cust_id   review_score
2021-10-19  1              0
2021-08-06  1              7
2021-07-06  1              3
2021-04-06  1              4
2021-07-06  2              5
2021-04-06  2              6

需求说明

新增字段num_prior_reviews,统计对应用户在当前评论日期之前的历史评论总数,预期输出如下:

date      cust_id   review_score num_prior_reviews
2021-10-19  1              0              3 
2021-08-06  1              7              2
2021-07-06  1              3              1
2021-04-06  1              4              0
2021-07-06  2              5              1
2021-04-06  2              6              0

逻辑示例:2021年10月19日用户1的评论,此前有4月、7月、8月共3条历史评论,所以num_prior_reviews值为3。
用户已尝试编写代码:row_number() over (partition by cust_id order by date DESC) as rank,需要正确的SQL实现方案。

实现方案

你原本的开窗函数思路方向正确,只需调整排序规则后做简单计算即可实现,以下是两种可直接使用的方案:

方案1:基于ROW_NUMBER调整(适合单用户同天只有1条评论的场景)

SELECT
    date,
    cust_id,
    review_score,
    ROW_NUMBER() OVER (PARTITION BY cust_id ORDER BY date ASC) - 1 AS num_prior_reviews
FROM base_table
ORDER BY cust_id, date DESC;

逻辑说明:按用户ID分组后按评论日期升序排序,行号从1开始计数,减1后正好等于当前行之前的历史评论数,完全匹配预期输出。

方案2:基于COUNT开窗(通用场景,支持单用户同天多条评论)

SELECT
    date,
    cust_id,
    review_score,
    COUNT(1) OVER (
        PARTITION BY cust_id 
        ORDER BY date 
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
    ) AS num_prior_reviews
FROM base_table
ORDER BY cust_id, date DESC;

逻辑说明:开窗统计每个用户分区内,从最早的评论到当前评论的前1条的总条数,直接得到当前评论之前的历史评论总数,兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:45:04