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

GROUP BY查询无法按日期筛选计数的技术求助

SQL修改方案:统计Table2中符合条件的记录数

需求

针对Table1中的每一行,统计Table2中Name相同且Date早于该行Date的记录数量,期望输出如下。

Table1

URIDateName
12020-03-05Fred
22020-03-04Bob
32020-03-03Fred
42020-03-02Dave
52020-03-01Dave
62020-02-28Fred
72020-02-27Bob
82020-02-26Bob
92020-02-25Fred
102020-02-24Fred

Table2

URIDateName
12020-03-05Fred
22020-03-04Bob
42020-03-02Dave
52020-03-01Dave
62020-02-28Fred
82020-02-26Bob
92020-02-25Fred
102020-02-24Fred

期望输出

URICountName
13Fred
21Bob
33Fred
41Dave
50Dave
62Fred
71Bob
80Bob
91Fred
100Fred

原SQL问题

当前编写的SQL仅能按Name分组统计Table2中对应Name的总记录数,无法针对Table1每行的Date筛选出更早的记录:

SELECT t1.uri,
       t1.date,
       t1.name,
       t2.cou
FROM       table1 t1
INNER JOIN (select name, 
                   count(name) AS cou
            FROM table2 t2
            GROUP BY name) t2 
        ON t1.name = t2.name
ORDER BY t1.uri

修改方案

方案一:关联子查询(直观简洁)

SELECT 
    t1.uri,
    t1.name,
    (SELECT COUNT(*) 
     FROM table2 t2 
     WHERE t2.name = t1.name 
       AND t2.date < t1.date) AS Count
FROM table1 t1
ORDER BY t1.uri;

对Table1的每一行,通过子查询直接统计Table2中满足Name匹配且Date更早的记录数,逻辑清晰,适合小数据量场景。

方案二:LEFT JOIN + GROUP BY(性能更优)

SELECT 
    t1.uri,
    t1.name,
    COUNT(t2.uri) AS Count
FROM table1 t1
LEFT JOIN table2 t2 
    ON t1.name = t2.name 
    AND t2.date < t1.date
GROUP BY t1.uri, t1.name
ORDER BY t1.uri;

通过LEFT JOIN同时匹配Name和Date条件,确保无匹配时Count显示0;再按Table1的URI和Name分组统计匹配记录数,适合大数据量场景,性能更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:05:43