【发布时间】:2021-10-10 21:52:21
【问题描述】:
我正在尝试汇总存储在 PostgreSQL 9.6 数据库列中的时间戳的不同非空值。
所以给定一个包含以下内容的表格:
date_array
------------------------
{2019-10-21 00:00:00.0}
{2019-08-06 00:00:00.0,2019-08-05 00:00:00.0}
{2019-08-05 00:00:00.0}
(null)
{2019-08-01 00:00:00.0,2019-08-06 00:00:00.0,null}
期望的结果是:
{2019-10-21 00:00:00.0, 2019-08-06 00:00:00.0, 2019-08-05 00:00:00.0, 2019-08-01 00:00:00.0}
数组可以有不同的大小,所以我尝试过的大多数解决方案最终都会遇到代码 0:
SQL State: 2202E ERROR: cannot accumulate arrays of different dimensionality.
其他一些注意事项:
数组可以为空,数组可以包含空。它们恰好是日期的时间戳(例如,没有时间或时区)。但是在尝试简化问题时,我没有运气将示例数据更改为字符串(例如{foo, bar, (null)}, {foo,baz}) - 只是为了专注于问题并消除我错过/不了解的有关时间戳的任何问题 w/o时区。
以下 SQL 是我最接近的(它解决了除不同维度之外的所有问题):
SELECT
ARRAY_REMOVE ( ARRAY ( SELECT DISTINCT UNNEST ( ARRAY_AGG ( CASE WHEN ARRAY_NDIMS(example.date_array) > 0 AND example.date_array IS NOT NULL THEN example.date_array ELSE '{null}' END ) ) ), NULL) as actualDates
FROM example;
我创建了以下 DB fiddle,其中包含示例数据,如果缺少上述内容,则说明问题:https://www.db-fiddle.com/f/8m469XTDmnt4iRkc5Si1eS/0
此外,我已经仔细阅读了有关该问题的 stackoverflow(以及 PostgreSQL 文档),并且有类似的问题和答案,但我发现没有一个问题能说明我遇到的相同问题。
【问题讨论】:
标签: sql arrays postgresql aggregation