借助IFELSE扩展/修改查询以获取更多条目(附数据集示例)
提取指定Account的最新有效记录解决方案
针对你需要提取指定account下,满足reason_type = 1且effective_date不为空的最新date记录的需求,我结合你提供的数据集示例,整理了两种常用的SQL实现方案:
数据集示例
| account | date | effective_date | value | reason_type |
|---|---|---|---|---|
| 123456 | 4/20/2017 | 5/1/2017 | 5 | 1 |
| 123456 | 1/20/2017 | 2/1/2017 | 10 | 1 |
| 987654 | ... | ... | ... | ... |
方案一:使用窗口函数(推荐)
这种方式逻辑清晰,代码简洁,大多数现代数据库(比如PostgreSQL、MySQL 8.0+、SQL Server等)都支持:
WITH ranked_records AS ( SELECT account, date, effective_date, value, reason_type, -- 按account分组,每组内按date降序排名,最新日期排第1 ROW_NUMBER() OVER (PARTITION BY account ORDER BY date DESC) AS record_rank FROM your_table_name WHERE reason_type = 1 AND effective_date IS NOT NULL ) SELECT account, date, effective_date, value, reason_type FROM ranked_records WHERE record_rank = 1;
逻辑说明
- 先通过CTE(公共表表达式)筛选出所有符合
reason_type = 1且effective_date不为空的记录,同时给每条记录按account分组、date降序排名 - 最后只取排名为1的记录,也就是每个
account下最新的符合条件的那条
方案二:使用子查询(兼容旧版本数据库)
如果你的数据库不支持CTE或窗口函数,可以用这种关联子查询的方式:
SELECT t.* FROM your_table_name t INNER JOIN ( -- 先找出每个符合条件的account的最新date SELECT account, MAX(date) AS latest_date FROM your_table_name WHERE reason_type = 1 AND effective_date IS NOT NULL GROUP BY account ) latest_dates ON t.account = latest_dates.account AND t.date = latest_dates.latest_date -- 再次过滤条件,确保拿到的记录符合要求 WHERE t.reason_type = 1 AND t.effective_date IS NOT NULL;
逻辑说明
- 子查询先分组统计每个
account下符合条件的最大date(即最新日期) - 将原表与子查询结果关联,匹配
account和date,从而拿到对应最新日期的完整记录 - 最后再次过滤条件,避免出现同
account同date但不符合要求的记录(如果你的数据不会出现这种情况,这一步可以省略)
内容的提问来源于stack exchange,提问作者Dan Manion
相关产品推荐
相关产品推荐

