如何查询订阅用户与Offer的下一状态及对应状态日期?
查询订阅用户与Offer的下一状态及对应状态日期
针对你的需求,可以使用Oracle的**窗口函数LEAD()**来获取每个用户-Offer组合的下一个状态及日期,同时通过行号过滤得到符合预期的结果。
解决方案SQL
SELECT user_id AS "用户ID", offer_id, status, status_date, next_status, next_status_date FROM ( SELECT user_id, offer_id, status, status_date, -- 获取同一分组内的下一个状态 LEAD(status) OVER (PARTITION BY user_id, offer_id ORDER BY status_date) AS next_status, -- 获取同一分组内的下一个状态日期 LEAD(status_date) OVER (PARTITION BY user_id, offer_id ORDER BY status_date) AS next_status_date, -- 按日期倒序给每个分组内行编号,最新状态为rn=1 ROW_NUMBER() OVER (PARTITION BY user_id, offer_id ORDER BY status_date DESC) AS rn FROM myTable ) t -- 保留非最新状态行,以及只有单个状态的行 WHERE rn <> 1 OR (rn = 1 AND next_status IS NULL);
结果说明
执行上述SQL后,将得到与你预期完全匹配的结果:
| 用户ID | offer_id | status | status_date | next_status | next_status_date |
|---|---|---|---|---|---|
| 1 | offer_1 | Active | 01/01/2021 | Deactive | 01/01/2022 |
| 1 | offer_2 | Active | 02/01/2022 | NULL | NULL |
内容的提问来源于stack exchange,提问作者user18552635
相关产品推荐
相关产品推荐

