SQL中如何基于index_date列值在WHERE子句中筛选符合年度要求的患者?
筛选连续三年存在的个体 SQL 实现
先明确前提:假设你的info_AAAA字段用1标记“存在”(如果是'Y'之类的标识,后面替换对应取值即可)。
简单场景:固定查某三个连续年份
比如你确定要找2021、2022、2023都存在的个体,直接写WHERE条件同时判断三列:
SELECT * FROM 你的实际表名 WHERE info_2023 = 1 AND info_2022 = 1 AND info_2021 = 1;
把你的实际表名换成你数据库里的真实表名,1换成你表中代表“存在”的取值即可。
符合你需求的动态场景:根据index_date自动匹配年份
因为你的index_date是基准日期,需要自动取它的年份作为AAAA,再匹配前两年的记录。不同数据库提取年份的函数不一样,给你列几种常用的写法:
MySQL/MariaDB/SQL Server
用YEAR()函数提取年份,通过CASE语句对应到对应的info_xxxx列:
SELECT * FROM 你的实际表名 WHERE -- 匹配基准年份的存在标记 CASE YEAR(index_date) WHEN 2023 THEN info_2023 WHEN 2022 THEN info_2022 WHEN 2021 THEN info_2021 -- 可继续添加更多需要覆盖的年份 END = 1 -- 匹配前一年的存在标记 AND CASE YEAR(index_date) - 1 WHEN 2022 THEN info_2022 WHEN 2021 THEN info_2021 WHEN 2020 THEN info_2020 END = 1 -- 匹配前两年的存在标记 AND CASE YEAR(index_date) - 2 WHEN 2021 THEN info_2021 WHEN 2020 THEN info_2020 WHEN 2019 THEN info_2019 END = 1;
PostgreSQL/Oracle
用EXTRACT(YEAR FROM ...)提取年份,逻辑和上面一致:
SELECT * FROM 你的实际表名 WHERE CASE EXTRACT(YEAR FROM index_date)::INT WHEN 2023 THEN info_2023 WHEN 2022 THEN info_2022 WHEN 2021 THEN info_2021 END = 1 AND CASE EXTRACT(YEAR FROM index_date)::INT - 1 WHEN 2022 THEN info_2022 WHEN 2021 THEN info_2021 WHEN 2020 THEN info_2020 END = 1 AND CASE EXTRACT(YEAR FROM index_date)::INT - 2 WHEN 2021 THEN info_2021 WHEN 2020 THEN info_2020 WHEN 2019 THEN info_2019 END = 1;
Oracle 里不需要加::INT,EXTRACT直接返回数字类型
小提示
- 如果你的
info_AAAA是用'Y'表示存在,把所有=1改成='Y'就行。 - 要是表数据量很大,给这些
info_xxxx字段加个索引,查询速度会快很多。
内容的提问来源于stack exchange,提问作者sqlbeginner0
相关产品推荐
相关产品推荐

