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

如何调整SQL语句获取过去3周(周六至周五)的统计数据?

修正后的SQL语句及说明

问题分析

原SQL的WHERE条件仅限定了单周的时间范围,因此只能返回上周数据。要获取过去3周(周六至周五为一个周期)的数据,需调整时间范围至覆盖3个完整周期,同时修正分组逻辑以匹配周周期统计需求。

修正方案

方案1:按每周周期(周六至周五)分组统计

如果需要按周维度统计(每个组对应一周的周六到周五),使用以下SQL:

SELECT
    -- 将每条数据映射至所属周的周六作为周起始标识
    DATE_SUB(timestamp, INTERVAL (WEEKDAY(timestamp) + 2) % 7 DAY) AS week_start,
    -- 聚合该周内的所有id(去重后拼接,可根据需求调整)
    GROUP_CONCAT(DISTINCT id) AS ids,
    COUNT(timestamp) AS nametotal
FROM amount_data
WHERE
    -- 时间范围:3周前的周六 至 最近的周五
    timestamp >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE()) - 7 DAY), INTERVAL 21 DAY)
    AND timestamp <= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE()) - 7 DAY), INTERVAL 1 DAY)
GROUP BY week_start
ORDER BY week_start;

方案2:按每日timestamp分组统计(保留原分组逻辑,扩展时间范围)

如果需要保留按timestamp(或日期)分组的逻辑,仅扩展时间范围至过去3周,使用以下SQL:

SELECT
    DATE(timestamp) AS date, -- 若timestamp含时分秒,建议转为日期维度分组
    GROUP_CONCAT(DISTINCT id) AS ids,
    COUNT(timestamp) AS nametotal
FROM amount_data
WHERE
    timestamp >= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE()) - 7 DAY), INTERVAL 21 DAY)
    AND timestamp <= DATE_SUB(DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE()) - 7 DAY), INTERVAL 1 DAY)
GROUP BY date
ORDER BY date;

关键逻辑说明

  1. 时间范围计算:
    • DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE()) -7 DAY):计算当前周的周六(DAYOFWEEK中周日为1,周六为7,因此该表达式可得到本周六的日期)。
    • 减去21天得到3周前的周六,减去1天得到最近的周五,从而覆盖过去3周的完整周期。
  2. 周分组标识:
    • DATE_SUB(timestamp, INTERVAL (WEEKDAY(timestamp) + 2) %7 DAY):将任意日期映射至其所在周的周六(WEEKDAY中周一为0,周六为5,通过计算偏移量实现)。
  3. id字段处理:
    • 原SQL中直接SELECT id不符合GROUP BY规则(非聚合列),因此使用GROUP_CONCAT(DISTINCT id)聚合该分组内的所有id,若不需要展示id可直接移除该字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:40:54