SQL查询websites表时如何为每条记录生成最近3天的rundate日期值
可以实现,你只需要将去重后的网站ID列表和最近3天的日期偏移序列做交叉连接即可,参考SQL写法如下(兼容支持VALUES子句的绝大多数数据库,如SQL Server、PostgreSQL、MySQL 8.0+等):
SELECT w.website_id, CAST(DATEADD(day, -n.day_offset, GETDATE()) AS DATE) AS rundate FROM (SELECT DISTINCT website_id FROM websites) w CROSS JOIN -- 生成0、1、2三个偏移量,对应当天、1天前、2天前,共3天日期 (VALUES (0), (1), (2)) n(day_offset) ORDER BY w.website_id, rundate DESC;
执行后即可得到你期望的每个网站ID对应最近3天日期的结果集。
另外需要注意你现有营收查询语句存在逻辑错误:date > %{run_date} AND date < DATEADD(day, -1, %{run_date})的条件不存在符合要求的记录,如果你要查询对应日期的单日营收,可调整为:
SELECT total_revenue FROM revenue WHERE website_id = %{website_id}% AND CAST(date AS DATE) = %{run_date}
如果你不需要逐天查询,也可以直接在营收表层面直接聚合统计每个网站最近3天的总营收,减少循环查询次数,参考写法:
SELECT w.website_id, SUM(IFNULL(r.total_revenue, 0)) AS last_3d_total_revenue FROM (SELECT DISTINCT website_id FROM websites) w LEFT JOIN revenue r ON w.website_id = r.website_id -- 时间区间包含最近3天完整日期 AND r.date >= DATEADD(day, -2, CAST(GETDATE() AS DATE)) AND r.date < CAST(DATEADD(day, 1, GETDATE()) AS DATE) GROUP BY w.website_id
内容的提问来源于stack exchange,提问作者russ2000
相关产品推荐
相关产品推荐

