Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从表中的开始日期和结束日期在Postgres中生成_系列_Sql_Postgresql_Aggregate Functions_Generate Series - Fatal编程技术网

Sql 从表中的开始日期和结束日期在Postgres中生成_系列

Sql 从表中的开始日期和结束日期在Postgres中生成_系列,sql,postgresql,aggregate-functions,generate-series,Sql,Postgresql,Aggregate Functions,Generate Series,我一直试图在时间戳字段中生成从第一个日期到最后一个日期的一系列日期(YYYY-MM-DD HH)。我已经得到了我需要的generate_series(),但是在试图从表中获取开始和结束日期时遇到了问题。我有以下几点粗略的想法: with date1 as ( SELECT start_timestamp as first_date FROM header_table ORDER BY start_timestamp DESC LIMIT 1 ), date2 as ( SELECT start_

我一直试图在时间戳字段中生成从第一个日期到最后一个日期的一系列日期(YYYY-MM-DD HH)。我已经得到了我需要的
generate_series()
,但是在试图从表中获取开始和结束日期时遇到了问题。我有以下几点粗略的想法:

with date1 as
(
SELECT start_timestamp as first_date
FROM header_table
ORDER BY start_timestamp DESC
LIMIT 1
),
date2 as
(
SELECT start_timestamp as first_date
FROM header_table
ORDER BY start_timestamp ASC    
LIMIT 1
)
    select generate_series(date1.first_date, date2.first_date
                         , '1 hour'::interval)::timestamp as date_hour

from
(   select * from date1
    union
    select * from date2) as foo
Postgres 9.3

试试这个:

with dateRange as
  (
  SELECT min(start_timestamp) as first_date, max(start_timestamp) as last_date
  FROM header_table
  )
select 
    generate_series(first_date, last_date, '1 hour'::interval)::timestamp as date_hour
from dateRange
NB:您希望这两个日期在a行中,而不是在单独的行中


改用聚合函数怎么样

with dates as (
      SELECT min(start_timestamp) as first_date, max(start_timestamp) as last_date
      FROM header_table
     )
select generate_series(first_date, last_date, '1 hour'::interval)::timestamp as date_hour
from dates;
甚至:

select generate_series(min(start_timestamp),
                       max(start_timestamp),
                       '1 hour'::interval
                      )::timestamp as date_hour
from header_table;

您不需要CTE,这将比必要的成本更高。
而且您不需要强制转换到
时间戳
,当您将
时间戳
类型馈送到时,结果已经是数据类型
时间戳
。详情如下:

在Postgres9.3或更高版本中,您可以使用
横向连接:

SELECT to_char(ts, 'YYYY-MM-DD HH24') AS formatted_ts
FROM  (
   SELECT min(start_timestamp) as first_date
        , max(start_timestamp) as last_date
   FROM   header_table
   ) h
  , generate_series(h.first_date, h.last_date, interval '1 hour') g(ts);
(可选)使用以文本形式获取您提到的格式的结果

这适用于任何Postgres版本:

SELECT generate_series(min(start_timestamp)
                     , max(start_timestamp)
                     , interval '1 hour') AS ts
FROM   header_table;
通常要快一点。
调用
SELECT
列表中的集合返回函数是一种非标准的SQL特性,有些人不赞成。此外,还有一些行为异常(虽然不是针对这个简单的案例)最终在第10期研究生中得到了解决。见:

注意NULL处理方面存在细微差异:

相当于

max(start_timestamp)
是用

ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
orderbystart\u时间戳DESC最后为空
限制1
如果没有
空值,则最后一个
空值按降序排在第一位(如果
开始时间戳中有空值
)。对于
last\u date
,您将得到NULL,查询结果将为空

详情:


一如既往,请提供您的Postgres版本。你提到的“问题”到底是什么?博士后9.3版-我道歉!谢谢你的帮助,非常感谢。在评估了Gordon Linoff之后,我接受了这个正确的答案,并且已经用过了。他们的答案很好,而且效果很好。然而,这缩短了大约20-30毫秒的时间。在一个几乎全天候在数百个表上运行的大型系统中,这将产生影响(尽管很小)
指的是?@RyderBrooks:
g(ts)
是表和列别名(省略可选关键字
作为
)。见: