这是我到目前为止的查询,创建每日栏:
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()不支持这些,我正在寻找一个很好的方式来做到这一点.
我从这里生成一个视图:
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)
将其从改变text到character varying.
似乎长度固定不是根据每个字长.
例如'星期五'应该有长度6和星期三长度9.
我怎么能改变这个,让长度是单词的实际长度?
因为稍后我将把这个表的weekday列与另一个表的weekday列进行比较.喜欢
where a.weekday=b.weekday
Run Code Online (Sandbox Code Playgroud)
另一个工作日来自jsp的用户,因此长度不同.
现在长度固定,比较失败.
我正在尝试将其用于返回工作日,但我不明白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)
有人可以帮我解释一下吗?
假设我有一个这样的搜索查询:
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) 我正在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) 我有一个包含数据的表,我想用 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 分钟间隔填充时间行。我怎样才能做到这一点?
我有一个名为 的重复日期表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)
为简单起见,您可以忽略重复的时间表,并假设所有事件都是每周发生的,例如始终在一周的同一天发生。
我怎样才能把这样的表转换成这样的东西:
+----------+---------------------------+
| event_id | start_at |
+----------+---------------------------+
| 35 | 2018-04-11 19:30:00 …Run Code Online (Sandbox Code Playgroud) 我正在使用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) 我想生成一个(行,列)对的网格,例如:
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
我在 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()我可以“垂直”地做到这一点,但是如何在一行中获得结果?
generate-series ×10
postgresql ×8
sql ×8
activerecord ×1
average ×1
cross-join ×1
date-format ×1
group-by ×1
row ×1
ruby ×1
time-series ×1