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

如何基于活动起止日期使用SQL统计每日活动数量?

基于活动起止日期统计每日活跃唯一活动数量的SQL实现

需求

统计每日处于活跃状态的唯一活动数量,活跃状态定义为日期在活动的起止日期之间(含起止日)。

输入表(表名:campaigns)

Campaign nameStart dateEnd date
Campaign A2022-07-102022-09-25
Campaign B2022-08-062022-10-07
Campaign C2022-07-302022-09-10
Campaign D2022-08-262022-10-24
Campaign E2022-07-172022-09-29
Campaign F2022-08-242022-09-12
Campaign G2022-08-112022-10-24
Campaign H2022-08-262022-11-22
Campaign I2022-08-292022-09-25
Campaign J2022-08-212022-11-15
Campaign K2022-07-202022-09-18
Campaign L2022-07-312022-11-20
Campaign M2022-08-172022-10-10
Campaign N2022-07-272022-09-07
Campaign O2022-07-292022-09-26
Campaign P2022-07-062022-09-15
Campaign Q2022-07-162022-09-22

期望输出

DateCount unique campaigns
2022-07-0217
2022-07-0347
2022-07-045
2022-07-055
2022-07-0625
2022-07-0727
2022-07-0817
2022-07-0958
2022-07-1023
2022-07-1153
2022-07-1218
2022-07-1329
2022-07-1452
2022-07-157
2022-07-1617
2022-07-1737
2022-07-1833

SQL实现方案

要实现这个需求,核心步骤是:

  1. 生成覆盖目标日期范围的连续日期序列;
  2. 将日期序列与活动表关联,筛选出每个日期处于活跃期的活动;
  3. 按日期分组,统计唯一活动的数量。

下面是不同主流数据库的具体实现代码:

PostgreSQL

-- 生成2022-07-02到2022-07-18的连续日期
WITH date_series AS (
    SELECT generate_series(
        '2022-07-02'::DATE,
        '2022-07-18'::DATE,
        '1 day'::INTERVAL
    ) AS date
),
active_campaigns AS (
    SELECT 
        ds.date::DATE,
        c."Campaign name"
    FROM date_series ds
    LEFT JOIN campaigns c
        ON ds.date BETWEEN c."Start date" AND c."End date"
)
SELECT 
    date AS "Date",
    COUNT(DISTINCT "Campaign name") AS "Count unique campaigns"
FROM active_campaigns
GROUP BY date
ORDER BY date;

MySQL 8.0+

-- 递归生成连续日期序列
WITH RECURSIVE date_series AS (
    SELECT '2022-07-02' AS date
    UNION ALL
    SELECT DATE_ADD(date, INTERVAL 1 DAY)
    FROM date_series
    WHERE date < '2022-07-18'
),
active_campaigns AS (
    SELECT 
        ds.date,
        c.`Campaign name`
    FROM date_series ds
    LEFT JOIN campaigns c
        ON ds.date BETWEEN c.`Start date` AND c.`End date`
)
SELECT 
    date AS `Date`,
    COUNT(DISTINCT `Campaign name`) AS `Count unique campaigns`
FROM active_campaigns
GROUP BY date
ORDER BY date;

SQL Server

-- 递归生成连续日期序列
WITH date_series AS (
    SELECT CAST('2022-07-02' AS DATE) AS date
    UNION ALL
    SELECT DATEADD(DAY, 1, date)
    FROM date_series
    WHERE date < CAST('2022-07-18' AS DATE)
),
active_campaigns AS (
    SELECT 
        ds.date,
        c.[Campaign name]
    FROM date_series ds
    LEFT JOIN campaigns c
        ON ds.date BETWEEN c.[Start date] AND c.[End date]
)
SELECT 
    date AS [Date],
    COUNT(DISTINCT [Campaign name]) AS [Count unique campaigns]
FROM active_campaigns
GROUP BY date
ORDER BY date
OPTION (MAXRECURSION 0); -- 解除递归层数限制,避免默认100层的限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:55:34