大于数组的任何元素
Greater than any element of array
我遇到了这个问题:
PostgreSQL 有没有办法将聚合的时间戳数据放入一个数组中(例如使用 array_agg
函数)然后 在某些条件下执行任何匹配?
我正在对聚合字符串(使用 string_agg(column,';')
)执行与 LIKE
类似的操作。但是如何在时间戳上执行类似的操作?
所以如果结果是 '{10.10.2021,20.12.2021,1.1.1996}' as timestamp_array
并且我想过滤至少有一个数组元素的行,在输入后?
例如,... WHERE 31.12.2021 > timestamp_array ...
将不匹配上面的行,因为在 2021 年 12 月 31 日之后没有数组元素。
但是如果我查询 ... WHERE 31.12.1996 > timestamp_array ...
,上面的行将被匹配(因为数组中至少有一个元素在给定的区间内)。
首先,您将使用标准日期格式。然后你可以使用:
where '2021-12-31' > any (timestamp_array)
Here 是一个 db<>fiddle 来说明这个想法。
I would like to filter rows that has at least one array element that is after some input?
您可以按照建议使用ANY
结构。
WHERE '1996-12-31'::timestamp < ANY ('{2021-10-10, 2021-12-20, 1996-01-01}'::timestamp[])
显然必须是 <
,而不是 >
。
您的“时间戳”看起来很像日期 - timestamp
输入也接受这一点。
但始终使用 recommended ISO 8601 format(如所示),否则您的输入取决于当前会话的设置。
参见:
- IN vs ANY operator in PostgreSQL
但很有可能,有更有效的方法。您谈到“聚合时间戳数据”。通常,在 聚合之前检查 会更有效。尤其是因为它可以使用索引,而不是你的方法。通常,EXISTS
可以完成这项工作。类似于:
SELECT ...
FROM tbl t
WHERE EXISTS (SELECT FROM tbl t1 WHERE t1.id = t.id AND t1.timestamp_column > '1996-12-31'
GROUP BY ...
使用您的查询的详细信息开始一个新问题以获得合适的解决方案。
我遇到了这个问题:
PostgreSQL 有没有办法将聚合的时间戳数据放入一个数组中(例如使用 array_agg
函数)然后 在某些条件下执行任何匹配?
我正在对聚合字符串(使用 string_agg(column,';')
)执行与 LIKE
类似的操作。但是如何在时间戳上执行类似的操作?
所以如果结果是 '{10.10.2021,20.12.2021,1.1.1996}' as timestamp_array
并且我想过滤至少有一个数组元素的行,在输入后?
例如,... WHERE 31.12.2021 > timestamp_array ...
将不匹配上面的行,因为在 2021 年 12 月 31 日之后没有数组元素。
但是如果我查询 ... WHERE 31.12.1996 > timestamp_array ...
,上面的行将被匹配(因为数组中至少有一个元素在给定的区间内)。
首先,您将使用标准日期格式。然后你可以使用:
where '2021-12-31' > any (timestamp_array)
Here 是一个 db<>fiddle 来说明这个想法。
I would like to filter rows that has at least one array element that is after some input?
您可以按照建议使用ANY
结构。
WHERE '1996-12-31'::timestamp < ANY ('{2021-10-10, 2021-12-20, 1996-01-01}'::timestamp[])
显然必须是 <
,而不是 >
。
您的“时间戳”看起来很像日期 - timestamp
输入也接受这一点。
但始终使用 recommended ISO 8601 format(如所示),否则您的输入取决于当前会话的设置。
参见:
- IN vs ANY operator in PostgreSQL
但很有可能,有更有效的方法。您谈到“聚合时间戳数据”。通常,在 聚合之前检查 会更有效。尤其是因为它可以使用索引,而不是你的方法。通常,EXISTS
可以完成这项工作。类似于:
SELECT ...
FROM tbl t
WHERE EXISTS (SELECT FROM tbl t1 WHERE t1.id = t.id AND t1.timestamp_column > '1996-12-31'
GROUP BY ...
使用您的查询的详细信息开始一个新问题以获得合适的解决方案。