SQL条件判断写法优化及新增查询功能技术问询
嘿,我来帮你优化这两个SQL写法的问题!
一、优化年份范围条件
你原来的多OR组合写法确实有点冗余,我们可以用更简洁的范围判断来替代,逻辑完全等价但可读性和紧凑性更好。因为你要的是当前年份前后一年的数据,也就是年份落在当前年份-1到当前年份+1的区间内,这里有两种常用优化写法:
方法1:使用BETWEEN运算符
year BETWEEN EXTRACT(YEAR FROM CURRENT_DATE) - 1 AND EXTRACT(YEAR FROM CURRENT_DATE) + 1
方法2:使用大于等于+小于等于
year >= EXTRACT(YEAR FROM CURRENT_DATE) - 1 AND year <= EXTRACT(YEAR FROM CURRENT_DATE) + 1
注:EXTRACT(YEAR FROM CURRENT_DATE)和你用的date_part('YEAR', CURRENT_DATE)功能完全一致,选哪个全看个人习惯。
二、完善
DISTINCT ON的查询逻辑 SELECT DISTINCT ON是PostgreSQL特有的语法,核心作用是按指定字段分组,只返回每组的第一行数据。但要注意它的结果完全依赖ORDER BY子句——如果不加明确排序,返回的another_column可能是随机值,这通常不符合业务需求。
比如你想按年份分组,且每个年份取another_column的最新值(假设表中有create_time字段记录数据生成时间),可以这样写完整的查询:
SELECT DISTINCT ON (alias.year) alias.year, alias.another_column FROM scheme.table AS alias WHERE alias.active IS TRUE AND year BETWEEN EXTRACT(YEAR FROM CURRENT_DATE) - 1 AND EXTRACT(YEAR FROM CURRENT_DATE) + 1 ORDER BY alias.year, alias.create_time DESC; -- 按创建时间倒序,确保取到每组最新的another_column
如果没有特定排序需求,至少也要把DISTINCT ON指定的字段放在ORDER BY的第一个位置,这是PostgreSQL的语法要求,能避免报错和结果不稳定。
内容的提问来源于stack exchange,提问作者FabianoLothor
相关产品推荐
相关产品推荐

