【问题标题】:Greater than any element of array大于数组的任何元素
【发布时间】:2021-07-19 19:01:13
【问题描述】:

我正面临这个问题:

PostgreSQL 中有没有办法将聚合的时间戳数据放入一个数组中(例如使用array_agg 函数),然后在某些条件下执行任何匹配

我在聚合字符串上使用LIKE 做类似的事情(使用string_agg(column,';'))。但是如何在时间戳上执行类似的操作呢?

那么,如果结果是'{10.10.2021,20.12.2021,1.1.1996}' as timestamp_array,并且我想过滤在某些输入之后至少具有一个数组元素的行?

例如,... WHERE 31.12.2021 > timestamp_array ... 与上面的行不匹配,因为 31.12.2021 之后没有数组元素。

但是如果我查询... WHERE 31.12.1996 > timestamp_array ...,上面的行将被匹配(因为数组的至少一个元素在给定的区间内)。

【问题讨论】:

    标签: sql arrays postgresql exists any


    【解决方案1】:

    首先,您将使用标准日期格式。然后你可以使用:

    where '2021-12-31' > any (timestamp_array)
    

    Here 是一个 dbfiddle 来说明这个想法。

    【讨论】:

      【解决方案2】:

      我想过滤在某个输入之后至少有一个数组元素的行?

      可以按照建议使用ANY 构造。

      WHERE '1996-12-31'::timestamp < ANY ('{2021-10-10, 2021-12-20, 1996-01-01}'::timestamp[])
      

      显然必须是&lt;,而不是&gt;
      您的“时间戳”看起来很像日期 - timestamp 输入也接受这一点。
      但始终使用recommended ISO 8601 format(如图所示),否则您的输入取决于当前会话的设置。

      见:

      但很有可能,有更有效的方法。您说的是“聚合时间戳数据”。通常,在聚合之前检查 会更有效率。尤其是因为这可以使用索引,而不是您的方法。通常,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 ...
      

      使用查询的详细信息开始一个新问题,以获得合适的解决方案。

      【讨论】:

        猜你喜欢
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        相关资源
        最近更新 更多