如何在水平行中显示某个日期范围内的所有日期



我在PostgreSQL中有一个名为t1的数据库表,类似于:

结束日期
名称 开始日期
10月18日 2018-10-01 2018-10-05

使用generate_series()。但是SQL不允许动态数量的结果列。因此,您必须将结果包装在字符串、数组或文档类型中才能使其工作。LATERAL子查询中ARRAY构造函数的示例-在Postgres 10或更高版本中:

SELECT t1.name, d.date_arr::date[]
FROM   t1
LEFT   JOIN LATERAL (
SELECT ARRAY(SELECT generate_series(t1.startdate::timestamp
, t1.enddate::timestamp
, interval '1 day'))
) d(date_arr) ON true;

为什么(最好(Postgres 10或更高?

  • SELECT子句中多个集合返回函数的预期行为是什么

为什么要转换为timestamp

  • 在PostgreSQL中生成两个日期之间的时间序列

为什么选择LEFT JOIN .. ON true

  • LATERAL JOIN和PostgreSQL中的子查询有什么区别

尽管在这种特殊情况下LEFT JOIN不是必需的(可能是CROSS JOIN(,因为ARRAY构造函数总是返回一行。

Postgres 9.1

LATERAL需要Postgres 9.3或更高版本。您可以用相关的子查询替代:

SELECT name
, ARRAY(SELECT generate_series(startdate::timestamp
, enddate::timestamp
, interval '1 day')::date)
FROM   t1;

甚至适用于第8.4页:

db<gt;小提琴这里

但可以考虑升级到当前版本。

crosstab()

crosstab()也无法克服SQL的静态特性。准备好的行类型的解决方法有限。。。

  • 使用CASE和GROUP BY动态替代pivot
  • PostgreSQL中为交叉表动态生成列
  • PostgreSQL交叉表查询

相关内容

  • 没有找到相关文章

最新更新