[英]SQL - Show all dates in a given range and count how many posts there are on that date using a timestamp from database
[英]How to show all dates from a certain date range in horizontal row?
我在 PostgreSQL 中有一个名为t1
数据库表,例如:
| Name | | StartDate | | EndDate |
----------------------------------------
| Oct-18 | | 2018-10-01| | 2018-10-05|
我想要日期范围的结果,如:
| Oct-18 | |2018-10-01| |2018-10-02| |2018-10-03| |2018-10-04| |2018-10-05|
在generate_series()
的帮助下,我可以“垂直”完成,但是如何在一行中获得结果?
使用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 或更高版本?
为什么要转换为timestamp
?
为什么LEFT JOIN .. ON true
?
尽管在这种特殊情况下不需要LEFT JOIN
(可能是CROSS JOIN
),因为 ARRAY 构造函数总是返回一行。
LATERAL
需要 Postgres 9.3 或更高版本。 您可以替换为相关子查询:
SELECT name
, ARRAY(SELECT generate_series(startdate::timestamp
, enddate::timestamp
, interval '1 day')::date)
FROM t1;
甚至适用于 pg 8.4:
db<> 在这里摆弄
但请考虑升级到当前版本。
crosstab()
? crosstab()
也不能克服 SQL 的静态特性。 准备好的行类型的解决方法有限......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.