如何不使用CTE获取用户累计分数达标0.05的最早日期?
无需CTE实现累计达标日期查询
需求说明
有一张包含user_id、order_id、creation_date、fractions、name字段的表,需要为每个user_id获取其累计fractions达到至少0.05的最小creation_date。
非CTE实现方案
可以直接用子查询结合窗口函数完成,核心是先计算用户按时间排序后的累计分数,再筛选首次达标记录的最早日期:
基础版(仅返回用户ID和达标日期)
SELECT user_id, MIN(creation_date) AS min_reach_date FROM ( SELECT user_id, creation_date, SUM(fractions) OVER (PARTITION BY user_id ORDER BY creation_date) AS cumulative_fractions FROM your_table_name ) AS sub_query WHERE cumulative_fractions >= 0.05 GROUP BY user_id;
逻辑拆解
- 内层子查询:通过
SUM() OVER (PARTITION BY user_id ORDER BY creation_date),按用户分组、日期排序计算累计分数,保证累加是按时间顺序进行的。 - 外层查询:筛选出累计分数达标(≥0.05)的记录,再按用户分组取最小的
creation_date,即为该用户首次达标最早的日期。
拓展版(返回达标日期对应完整订单信息)
如果需要同时获取达标日期对应的订单详情,可以用关联查询:
SELECT t.* FROM your_table_name t JOIN ( SELECT user_id, MIN(creation_date) AS min_reach_date FROM ( SELECT user_id, creation_date, SUM(fractions) OVER (PARTITION BY user_id ORDER BY creation_date) AS cumulative_fractions FROM your_table_name ) AS sub WHERE cumulative_fractions >= 0.05 GROUP BY user_id ) AS reach_dates ON t.user_id = reach_dates.user_id AND t.creation_date = reach_dates.min_reach_date;
内容的提问来源于stack exchange,提问作者Fabio Manniti
相关产品推荐
相关产品推荐

