You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:41