分组查询中能否使用contains any函数?如何从FRUIT_TRANSPORT与FRUIT表生成目标去重表
问题解答
一、重复数据处理建议
从FRUIT_TRANSPORT(事实表)和FRUIT(维度表)生成目标表时遇到重复数据,可按以下步骤排查解决:
- 定位重复来源:
- 检查事实表自身重复:执行
SELECT 主键/唯一标识字段, COUNT(*) FROM FRUIT_TRANSPORT GROUP BY 主键/唯一标识字段 HAVING COUNT(*) > 1,若返回结果说明事实表存在重复记录,可通过DISTINCT或窗口函数去重,示例:SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 唯一标识字段 ORDER BY 加载时间 DESC) AS rn FROM FRUIT_TRANSPORT ) t WHERE rn = 1 - 检查关联导致的重复:若事实表无重复,大概率是维度表FRUIT中同一关联键(如fruit_id)对应多条记录,关联后数据膨胀。可先对维度表去重再关联,示例:
SELECT ft.*, f.fruit_name FROM FRUIT_TRANSPORT ft JOIN (SELECT DISTINCT fruit_id, fruit_name FROM FRUIT) f ON ft.fruit_id = f.fruit_id
- 检查事实表自身重复:执行
- 若上述方法无效,需确认目标表业务逻辑:是否允许部分字段重复,或是否需要调整分组聚合的维度(增加分组字段避免重复)。
二、分组查询中能否使用contains any函数?
可以,具体语法和支持情况取决于所用数据库:
- PostgreSQL:支持数组操作的
ANY,可在分组的HAVING子句中直接使用。示例1:筛选分组后某字段匹配数组任意元素的组
示例2:判断聚合后的数组是否包含任意指定元素SELECT fruit_id, COUNT(*) FROM FRUIT_TRANSPORT GROUP BY fruit_id HAVING fruit_type = ANY('{apple, banana}'::text[])SELECT fruit_category FROM FRUIT GROUP BY fruit_category HAVING array_agg(fruit_name) && '{apple, orange}'::text[] - SQL Server:无直接
contains any函数,但可通过CONTAINS结合OR实现类似逻辑,在HAVING中使用:SELECT fruit_id, COUNT(*) FROM FRUIT_TRANSPORT GROUP BY fruit_id HAVING CONTAINS(fruit_desc, '"apple" OR "banana"')
核心结论:分组查询的HAVING子句中完全可以使用包含“任意匹配”逻辑的函数或表达式,只需根据数据库语法调整写法。
内容的提问来源于stack exchange,提问作者maijanen
相关产品推荐
相关产品推荐

