如何在smallint类型Taxyear列筛选最近10个年度的数据
获取最近10个Taxyear的正确查询方法
原查询错误原因
你之前的查询之所以返回所有年份,是因为GROUP BY Taxyear会将每个年份单独分组,此时HAVING子句里的MAX(taxyear)就是当前分组的年份本身,条件等价于taxyear between taxyear-10 and taxyear,所有年份都满足这个条件,自然会返回所有结果。
正确查询语句
以下几种方法都能实现需求,自动获取最新年份及其过去10年的数据:
方法1:子查询直接筛选
SELECT DISTINCT Taxyear FROM Property WHERE Taxyear >= (SELECT MAX(Taxyear) FROM Property) - 10 ORDER BY Taxyear;
- 先用子查询获取表中最新的
Taxyear - 筛选年份大于等于「最新年份-10」的记录
DISTINCT用于去重(因为表中可能存在多个同一年份的记录)ORDER BY确保结果按年份升序排列
方法2:CTE定义最新年份后筛选
WITH MaxTaxYear AS ( SELECT MAX(Taxyear) AS LatestYear FROM Property ) SELECT DISTINCT p.Taxyear FROM Property p CROSS JOIN MaxTaxYear m WHERE p.Taxyear >= m.LatestYear - 10 ORDER BY p.Taxyear;
- 用CTE(公共表表达式)单独计算最新年份,逻辑更清晰
- 通过交叉连接将最新年份应用到所有行的筛选条件中
- 同样通过
DISTINCT去重,ORDER BY排序
说明
如果某些年份在表中不存在(比如2020年没有数据),上述查询只会返回实际存在的年份,不会生成空的年份记录。
内容的提问来源于stack exchange,提问作者tkuligowski
相关产品推荐
相关产品推荐

