如何在PostgreSQL中找出未被其他数组包含的日期数组?
解决方案
首先确认你的dates列如果是逗号分隔的文本,需要先转换为日期数组;如果已经是date[]类型,可跳过转换部分。
核心思路是:筛选出不存在其他行的日期数组完全包含当前行日期数组的记录,同时排除自身比较的情况。
最终SQL查询
SELECT t1.* FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.dates <> t1.dates -- 排除自身 AND string_to_array(t1.dates, ',')::date[] <@ string_to_array(t2.dates, ',')::date[] );
说明
string_to_array(dates, ',')::date[]:将逗号分隔的日期字符串转换为PostgreSQL日期数组,若你的dates本身就是date[]类型,直接替换为t1.dates和t2.dates即可。<@:PostgreSQL数组操作符,用于判断左数组是否被右数组完全包含。NOT EXISTS:确保当前行的日期数组没有被其他任何行的日期数组包含。
执行上述查询后,会返回你期望的三条记录:
- 2023-09-03至2023-09-06的4天数组(没有更大的数组包含它)
- 2023-09-18至2023-09-21的4天数组
- 2023-09-23的1天数组(无其他数组包含它)
内容的提问来源于stack exchange,提问作者OldFred
相关产品推荐
相关产品推荐

