SQL中如何在ROUND函数相关逻辑内使用DISTINCT实现列值去重
SQL列去重实现方案
核心思路是将去重逻辑前置到数据读取阶段,和后续的计算逻辑完全拆分,既不会破坏原有case的返回结果,也不需要在cast内部嵌套子查询。
方案1:CTE提前去重(推荐)
兼容大多数支持CTE语法的数据库(MySQL 8.0+、SQL Server、PostgreSQL、Oracle等)
WITH distinct_source AS ( -- 提前对关联判断字段、计算字段做去重 SELECT DISTINCT x, y, value FROM 你的业务表名 -- 可在此处提前添加业务过滤条件,减少数据计算量 ) SELECT ISNULL( CASE WHEN x = y THEN CAST(ISNULL(ROUND(value, 0), 0) AS INT) ELSE 1 END, 0) AS target_column FROM distinct_source
方案2:派生表去重
适用于不支持CTE的低版本数据库
SELECT ISNULL( CASE WHEN x = y THEN CAST(ISNULL(ROUND(value, 0), 0) AS INT) ELSE 1 END, 0) AS target_column FROM ( SELECT DISTINCT x, y, value FROM 你的业务表名 ) AS distinct_t
- 若去重需要关联其他业务字段,直接将对应字段添加到
DISTINCT后的字段列表中即可,不会影响原有case的计算逻辑。
内容的提问来源于stack exchange,提问作者Sree Lakshmi K M
相关产品推荐
相关产品推荐

