基于时间戳填充网格日期:如何补全左连接空缺的最新orders_count_sum
方案1:支持IGNORE NULLS的数据库(PostgreSQL/Spark SQL/Hive/BigQuery等)适用
先完成基础左连接,再通过窗口函数跳过空值取最近的非空订单数:
SELECT u.user_id, u.date, LAST_VALUE(o.orders_count_sum) IGNORE NULLS OVER ( PARTITION BY u.user_id ORDER BY u.date DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS orders_count_sum FROM users u LEFT JOIN orders o ON u.user_id = o.user_id AND u.date = o.date WHERE u.user_id = 13 ORDER BY u.date DESC;
逻辑:左连接保留users表所有日期后,窗口按日期倒序排列,每一行取当前行及之前第一条非空的订单数,刚好匹配取最新有效订单数的需求。
方案2:全数据库通用写法(无数据库版本/语法限制)
通过关联子查询逐行匹配最近的订单记录:
SELECT u.user_id, u.date, ( SELECT o.orders_count_sum FROM orders o WHERE o.user_id = u.user_id AND o.date <= u.date ORDER BY o.date DESC LIMIT 1 ) AS orders_count_sum FROM users u WHERE u.user_id = 13 ORDER BY u.date DESC;
逻辑:对users表的每一行日期,直接去orders表查找该用户小于等于当前日期的最新一条订单记录,返回对应的订单数,不会出现空值。
注:你示例中的
2020-06-31为无效日期,实际业务使用时请注意日期合法性,不影响上述逻辑运行。
内容的提问来源于stack exchange,提问作者Grzesiek
相关产品推荐
相关产品推荐

