文档的generate_series说这样的说法可能是int或bigint用于generate_series(start, stop)与generate_series(start, stop, step)案件timestamp或timestamp with time zone为generate_series(start, stop, step interval).
generate_series使用date类型作为输入和返回的原因是什么timestamp with timezone?
pg=# select generate_series('2014-01-01'::date,'2014-01-02'::date,'1 day');
generate_series
------------------------
2014-01-01 00:00:00+01
2014-01-02 00:00:00+01
(2 rows)
Run Code Online (Sandbox Code Playgroud) 有谁知道如何在PostgreSQL中扩展频率表?
例如,转换表x:
data | frequency
-------+-----------
string | 4
Run Code Online (Sandbox Code Playgroud)
成
data | index
-------+-------
string | 1
string | 2
string | 3
string | 4
Run Code Online (Sandbox Code Playgroud)
设置代码:
CREATE TABLE x (
data TEXT,
frequency INTEGER
);
INSERT INTO x VALUES ('string',4);
Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL 9.4中有一个SQL查询,虽然由于我从中提取数据的表格更复杂,但归结为以下内容:
SELECT entry_date, user_id, <other_stuff>
FROM <tables, joins, etc>
GROUP BY entry_date, user_id
WHERE <whatever limits I want, such as limiting the date range or users>
Run Code Online (Sandbox Code Playgroud)
结果是每个用户每天有一行,我有数据.通常,此查询将在一个月的entry_date期间运行,期望的结果是每个用户每月有一行.
问题是每个月的每个用户可能没有数据,并且此查询仅返回包含数据的天数的行.
是否有某种方法可以修改此查询,以便每个用户每天返回一行,即使某些行中没有数据(日期和用户除外)?
我尝试使用a进行连接generate_series(),但这不起作用 - 它可以使没有错过的日子,但不是每个用户.我真正需要的是"为列表中的每个用户生成一系列(user,date)记录"
编辑:澄清一下,我要找的最终结果是,对于数据库中的每个用户 - 定义为用户表中的记录 - 我希望每个日期有一行.因此,如果我在where子句中指定日期范围5/1/15-5/31/15,我希望每个用户有31行,即使该用户在该范围内没有数据,或者只有几个数据天.
我尝试使用这样的占位符进行查询
database.Query("select login,displayname from (select distinct $1+trunc(random()*$2)::integer as id from generate_series($3,$4) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
Run Code Online (Sandbox Code Playgroud)
它抛出了一个错误:
pq: function generate_series(unknown, unknown) is not unique
Run Code Online (Sandbox Code Playgroud)
然后我找到了一个将查询格式化为字符串的解决方案
query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
Run Code Online (Sandbox Code Playgroud)
它的工作原理.
我想以正确的方式使它工作,但我不明白为什么它没有.
更新:
var min_id int64
var max_id int64
err:=_database.QueryRow("select min(id),max(id) from users").Scan(&min_id, &max_id)
if err!=nil {
log.Panicf("Failed to get min and max %v",err.Error())
return
}
var rows *sql.Rows
query:=fmt.Sprintf("select login,displayname from (select distinct …Run Code Online (Sandbox Code Playgroud) 我需要为报告创建一个空的时间表系列,这样我就可以将几个表的连接活动留给它了.一天中的每个小时都不一定有数据,但我希望它显示为零或零以获取不活动而不是省略当天的那个小时.
在后期版本的Postgres(后8.0.2版)中,这在以下几个方面很容易:
SELECT unnest(array[0,1,2,3,4...]) as numbers
要么
CROSS JOIN (select generate_series as hours
from generate_series(now()::timestamp,
now()::timestamp + interval '1 day',
'1 hour'::interval
)) date_series
Redshift可以运行其中一些命令,但是当您尝试与任何表一起运行它时会引发错误.
我需要的:
生成一系列数字(例如0-23)作为将在redshift上运行的子查询的可靠方法(使用postgres 8.0.2).
我有一个包含记录的现有表,我刚刚添加了一个新列ver,我希望它是唯一的。
create table foo (
bar text,
ver integer
);
select * from foo;
bar ver
--- ---
one null
two null
three null
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我正在努力解决如何做到这一点。
我想做类似的事情:
update foo set ver = ( select generate_series(1, 1000) );
Run Code Online (Sandbox Code Playgroud)
或者可能
update foo set ver = v from (select generate_series(1, 1000) as v );
Run Code Online (Sandbox Code Playgroud)
...但当然这些都不起作用。任何人都可以为我指出显而易见的吗?
我有一个小问题.我有一个这种格式的PostgreSQL表
time (datetime) | players (int) | servers (int)
---------------------------------------------------
2013-12-06 13:40:01 | 80 | 20
2013-12-06 13:41:13 | 78 | 21
etc.
Run Code Online (Sandbox Code Playgroud)
我想将它们分组为5分钟,并将该组的平均值作为单个值,因此将有20%的记录,每个记录包含平均~5个数字,时间设置为第一次的值群组.我不知道如何在PgSQL中做到这一点.结果将是:
2013-12-06 13:40:01 | avg of players on :40, :41, :42, :43, :44 | same with servers
2013-12-06 13:45:05 | avg of players on :45, :46, :47, :48, :49 | same with servers
2013-12-06 13:50:09 | avg of players on :50, :51, :52, :53, :54 | same with servers
2013-12-06 13:55:12 | avg of players on :55, …Run Code Online (Sandbox Code Playgroud) sql postgresql timestamp aggregate-functions generate-series
我在表格中有一些ID,但两者之间存在差距.我想选择这些差距.
例如,我表中的整数是:
1
2
5
9
15
Run Code Online (Sandbox Code Playgroud)
我想选择:
3
4
6
7
8
10
11
12
13
14
Run Code Online (Sandbox Code Playgroud)
我的PostgreSQL版本是9.1.1,所以我不能使用int4range.
我得到了一些组合generate_series的奇怪行为.在我试图用网格填充的2个不同的多边形中,一个网格非常罕见:

查询是这样的:
SELECT
osm_id ,
generate_series(floor(st_xmin(way))::int, ceiling(st_xmax(way))::int, 150) x,
generate_series(floor(st_ymin(way))::int, ceiling(st_ymax(way))::int, 150) y
from osm_polygon
order by osm_id, x, y;
Run Code Online (Sandbox Code Playgroud)
我试着追踪问题,只输入了最小/最大坐标.从最小值/最大值生成序列创建正确的值数:分别为9行和12行.
=> select generate_series(9237195, 9238873, 150) x;
x
---------
9237195
9237345
9237495
9237645
9237795
9237945
9238095
9238245
9238395
9238545
9238695
9238845
(12 rows)
=> select generate_series(7371701, 7372922, 150) y order by y;
y
---------
7371701
7371851
7372001
7372151
7372301
7372451
7372601
7372751
7372901
(9 rows)
Run Code Online (Sandbox Code Playgroud)
结合起来,他们应该制作108排吧?不,只有36行:
=> select generate_series(9237195, 9238873, 150) x, generate_series(7371701, 7372922, 150) y order by x, y; …Run Code Online (Sandbox Code Playgroud) 我有下表:
create_table "activities", force: :cascade do |t|
...
t.date "start_date", null: false
t.time "start_time", null: false
t.date "end_date", null: false
t.time "end_time", null: false
...
end
Run Code Online (Sandbox Code Playgroud)
此表可以包含start_date等于end_date和其他活动的活动,这些活动以不同的日期结束start_date.
我要做的是构建一个SQL查询,它将返回两个日期之间有一些活动的所有日期.
例如:
Activity 1: start_date: 2015-04-15, end_date: 2015-04-15Activity 2: start_date: 2015-04-16, end_date: 2015-04-18该查询将接受两个参数:start_date和end_date,例如:
start_date: 2015-04-01end_date: 2015-04-30执行将返回这两个日期之间活动的所有日期.在上面的例子中,结果将是:
该应用程序使用Ruby on Rails编写,数据库使用Postgres.这可以使用Ruby代码解决,但我不希望出于性能原因这样做.
如何在Postgres中只使用一个SQL语句来实现此查询?我认为generate_seriesPostgres功能可以帮助解决这个问题,但是如何解决?
generate-series ×10
postgresql ×9
sql ×5
timestamp ×2
activerecord ×1
combinations ×1
cross-join ×1
dateinterval ×1
go ×1
left-join ×1
postgis ×1
sql-update ×1
time-series ×1
types ×1
unique ×1