如何使用SQL借助Lookup静态表按日从Driver表选取指定数量记录
SQL实现按日定量抽取Driver表记录方案
核心实现逻辑
你需要先将Driver表的timestamp字段转换为与Static表Day字段格式一致的日期作为关联键,再通过窗口函数给每日的Driver记录排序,最后关联Static表过滤出符合数量要求的记录即可。
可直接参考的代码示例(以MySQL为例,其他数据库仅需修改日期转换、排序函数即可)
WITH driver_ranked AS ( SELECT -- 将timestamp转为日期,格式和Static表的Day字段保持一致 DATE(d.timestamp) AS driver_day, d.balance, d.payment, -- 按日期分组,给每个分组内的记录排序,无特殊抽取规则可直接按timestamp排序 ROW_NUMBER() OVER (PARTITION BY DATE(d.timestamp) ORDER BY d.timestamp) AS row_num FROM Driver d ) SELECT dr.driver_day, dr.balance, dr.payment FROM driver_ranked dr -- 关联存储每日抽取量的Static表 JOIN Static s ON dr.driver_day = s.Day -- 过滤出排序序号小于等于当日需抽取数量的记录 WHERE dr.row_num <= s.Count;
注意事项
- 若你需要随机抽取当日的记录,可将窗口函数中的排序规则改为
ORDER BY RAND()(MySQL)、ORDER BY NEWID()(SQL Server)、ORDER BY RANDOM()(PostgreSQL) - 请提前确认Static表的Day字段格式和Driver表转换出的日期格式完全匹配,比如Static表用
MM/DD格式的话,日期转换就要改成DATE_FORMAT(d.timestamp, '%m/%d'),避免关联失败 - 建议给Driver表的timestamp字段添加索引,100万条数据量级下加索引可以大幅提升查询效率
内容的提问来源于stack exchange,提问作者Sandhya somineni
相关产品推荐
相关产品推荐

