标签: generate-series

检索任意时间间隔的聚合

这是我到目前为止的查询,创建每日栏:

SELECT DISTINCT date_trunc('hour',t) AS date,
min(price) OVER w,
max(price) OVER w,
first_value(price) OVER w,
last_value(price) OVER w
FROM ticker
WINDOW w AS (PARTITION BY date_trunc('hour',t));
Run Code Online (Sandbox Code Playgroud)

将"小时"更改为"分钟"或"天"将为我提供与这些单位对应的条形图.

但是,如果我想要5分钟或15分钟的酒吧怎么办?date_trunc()不支持这些,我正在寻找一个很好的方式来做到这一点.

sql postgresql generate-series

4
推荐指数
1
解决办法
1279
查看次数

从to_char()输出中删除空白填充

我从这里生成一个视图:

create or replace view datetoday as
select to_char(dt, 'yyyy-mm-dd') as date, to_char(dt, 'Day') as weekday from 
(select ('2013-03-01'::date + i) dt from generate_series(0,'2013-03-03'::date - 2013-03-01'::date) 
as t(i)) as t;
Run Code Online (Sandbox Code Playgroud)

它给了我工作日信息text类型.然后我用:

select date::date, weekday::varchar from datetoday;
Run Code Online (Sandbox Code Playgroud)

现在桌子就像

2013-3-1 Friday
2013-3-2 Saturday
Run Code Online (Sandbox Code Playgroud)

如果我想选择条目:

select * from datetoday where weekday='Friday'
Run Code Online (Sandbox Code Playgroud)

将其从改变textcharacter varying.

似乎长度固定不是根据每个字长.
例如'星期五'应该有长度6和星期三长度9.
我怎么能改变这个,让长度是单词的实际长度?

因为稍后我将把这个表的weekday列与另一个表的weekday列进行比较.喜欢

where a.weekday=b.weekday
Run Code Online (Sandbox Code Playgroud)

另一个工作日来自jsp的用户,因此长度不同.
现在长度固定,比较失败.

sql postgresql database-design date-format generate-series

4
推荐指数
1
解决办法
1330
查看次数

"sa"在此generate_series()查询中的含义是什么

我正在尝试将其用于返回工作日,但我不明白s.a并且s(a)在此查询中:

SELECT dia 
FROM (
    SELECT ('2012-08-01'::date + s.a * '1 day'::interval) AS dia
    FROM generate_series(0, '2012-08-31'::date - '2012-08-01'::date, 1) AS s(a)
) foo
WHERE EXTRACT(DOW FROM dia) BETWEEN 1 AND 5
EXCEPT
SELECT feriado_data FROM teste.feriado;
Run Code Online (Sandbox Code Playgroud)

有人可以帮我解释一下吗?

postgresql generate-series

3
推荐指数
1
解决办法
925
查看次数

获取每天创建的条目数

假设我有一个这样的搜索查询:

SELECT COUNT(id), date(created_at)
FROM entries
WHERE date(created_at) >= date(current_date - interval '1 week')
GROUP BY date(created_at)
Run Code Online (Sandbox Code Playgroud)

如您所知,例如我得到的结果如下:

count | date
  2   |  15.01.2014
  1   |  13.01.2014
  9   |  09.01.2014
Run Code Online (Sandbox Code Playgroud)

但我没有得到一周中没有创建条目的日子。

如何获得如下所示的搜索结果,包括没有创建条目的日期?

count | date
  2   |  15.01.2014
  0   |  14.01.2014
  1   |  13.01.2014
  0   |  12.01.2014
  0   |  11.01.2014
  0   |  10.01.2014
  9   |  09.01.2014
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions generate-series

3
推荐指数
1
解决办法
3156
查看次数

Rails ActiveRecord Arels:不支持的参数类型:字符串。构造一个Arel节点

我正在Arels用于创建查询。在此查询中,我使用generate_series函数。这是我的代码:

    def generate_series
      Arel::Nodes::NamedFunction.new('GENERATE_SERIES', [start_date, end_day, '1 day'])
    end

def start_date
      Arel::Nodes::SqlLiteral.new(<<-SQL
         CASE WHEN DATE_PART('hour', NOW() AT TIME ZONE 'ICT') < #{Time.now - 3days} THEN (CURRENT_DATE - INTERVAL '14 days') ELSE (CURRENT_DATE - INTERVAL '13 days') END
      SQL
      )
    end

    def end_date
      Arel::Nodes::SqlLiteral.new(<<-SQL
         CASE WHEN DATE_PART('hour', NOW() AT TIME ZONE 'ICT') < #{Time.now} THEN (CURRENT_DATE - INTERVAL '1 day') ELSE CURRENT_DATE END
      SQL
      )
    end
Run Code Online (Sandbox Code Playgroud)

当我尝试通过generate_series.to_sql。我遇到例外:

Arel :: Visitors :: UnsupportedVisitError:不支持的参数类型:字符串。而是构造一个Arel节点。

我尝试缩短测试代码:

def generate_series …
Run Code Online (Sandbox Code Playgroud)

ruby sql activerecord ruby-on-rails generate-series

3
推荐指数
2
解决办法
5290
查看次数

在 PostgreSQL 查询中使用 generate_series

我有一个包含数据的表,我想用 PostgreSQL 用 generate_series 填补日期空白,但我无法解决它。如何将我的表加入 generate_series 结果?我的尝试如下:

SELECT series AS time,
       data 
FROM generate_series('2012-11-11', '2012-11-12', '2 minutes'::interval) AS series
LEFT JOIN data_table ON data_table.time = series
Run Code Online (Sandbox Code Playgroud)

在此日期范围内,结果为:

               TIME             DATA
        2012.11.11. 13:00:06 | data 1
        2012.11.11. 13:08:06 | data 2 
Run Code Online (Sandbox Code Playgroud)

我的目标是这样的:

            TIME            DATA
    2012.11.11. 13:00:06 | data 1
    2012.11.11. 13:02:06 | NULL
    2012.11.11. 13:06:06 | NULL
    2012.11.11. 13:08:06 | data 2 
    2012.11.11. 13:10:06 | NULL
    2012.11.11. 13:12:06 | NULL
    ...
Run Code Online (Sandbox Code Playgroud)

因此,整个表格以 2 分钟间隔填充时间行。我怎样才能做到这一点?

sql postgresql generate-series

3
推荐指数
1
解决办法
3100
查看次数

使用 postgresgenerate_series 生成循环计划

我有一个名为 的重复日期表Events,如何使用该表并根据事件日期和时间从一系列中生成特定的即将到来的日期?(例如,只有工作日“星期一”和开始时间“晚上 7 点”很重要)

事件

+-----+---------------------------+---------------------+
| id  | start_at                  | recurring_schedule  |
+-----+---------------------------+---------------------+
| 358 | 2015-01-23 20:00:00 +0000 | Weekly              |
| 359 | 2016-01-22 19:30:00 +1100 | Monthly             |
| 360 | 2016-02-01 19:00:00 +1100 | Weekly              |
| 361 | 2016-02-01 20:00:00 +0000 | Weekly              |
| 362 | 2014-02-13 20:00:00 +0000 | Bi-Weekly           |
+-----+---------------------------+---------------------+
Run Code Online (Sandbox Code Playgroud)
  • start_at(日期时间,用于 DOW 和开始时间,忽略实际日期)

为简单起见,您可以忽略重复的时间表,并假设所有事件都是每周发生的,例如始终在一周的同一天发生。

我怎样才能把这样的表转换成这样的东西:

未来日志

+----------+---------------------------+
| event_id | start_at                  |
+----------+---------------------------+
| 35       | 2018-04-11 19:30:00 …
Run Code Online (Sandbox Code Playgroud)

postgresql generate-series postgresql-9.4

3
推荐指数
1
解决办法
2052
查看次数

如何获得Postgres中时间间隔的平均值

我正在使用PostgreSQL 9.6.我有这样一张桌子:

mac   sn         loc   time     date      vin1    vin2    vin3
1a34 4as11111111 aaaa  7:06:18  1/1/2018  447.42  472.32  682.59
1a34 4as11111111 aaaa  7:06:43  1/1/2018  455.97  476.25  682.59
1a34 4as11111111 aaaa  7:07:35  1/1/2018  470.88  484.2   682.5
Run Code Online (Sandbox Code Playgroud)

我需要计算的平均vin1,vin2,vin3300秒(5分钟)的时间间隔内.例如,从第一次(7:06:18 - 7:11:18)开始,为范围内的日期.我可以使用此查询选择我需要的数据:

select * from table
where sn='4as11111111' and date between '2018-01-01' and '2018-01-02';
Run Code Online (Sandbox Code Playgroud)

但我不知道如何用300秒的时间间隔组,并为计算平均vin1,vin2,vin3对于那些5分钟间隔栏,让这样的事情:

mac  sn          loc     time     date      vin1_av  vin2_av  vin3_av
1a34 4as11111111 aaaa   7:06:18  1/1/2018  450.0    480.32   600.59
1a34 4as11111111 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql group-by average generate-series

3
推荐指数
1
解决办法
1971
查看次数

如何使用 generate_series() 生成值网格

我想生成一个(行,列)对的网格,例如:

1 | 1
1 | 2
1 | 3
...
2 | 1
2 | 2
...
Run Code Online (Sandbox Code Playgroud)

我天真的方法有这种令人费解的行为:

select generate_series(1,5), generate_series(1, 5);
 generate_series | generate_series
-----------------+-----------------
               1 |               1
               2 |               2
               3 |               3
               4 |               4
               5 |               5
(5 rows)

select generate_series(1,5), generate_series(1, 4);
 generate_series | generate_series
-----------------+-----------------
               1 |               1
               2 |               2
               3 |               3
               4 |               4
               5 |               1
               1 |               2
               2 |               3
               3 |               4
               4 |               1
               5 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql cross-join generate-series set-returning-functions

3
推荐指数
1
解决办法
837
查看次数

如何在水平行中显示特定日期范围内的所有日期?

我在 PostgreSQL 中有一个数据库表,命名如下t1

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

我想要日期范围的结果,例如:

10 月 18 日 2018-10-01 2018-10-02 2018-10-03 2018-10-04 2018-10-05

在我的帮助下,generate_series()我可以“垂直”地做到这一点,但是如何在一行中获得结果?

sql row time-series postgresql-9.1 generate-series

3
推荐指数
1
解决办法
1125
查看次数