我想是从generate_series,每个月的统计和计数的ID在每月的总和.这个SQL适用于PostgreSQL 9.1:
SELECT (to_char(serie,'yyyy-mm')) AS year, sum(amount)::int AS eintraege FROM (
SELECT
COUNT(mytable.id) as amount,
generate_series::date as serie
FROM mytable
RIGHT JOIN generate_series(
(SELECT min(date_from) FROM mytable)::date,
(SELECT max(date_from) FROM mytable)::date,
interval '1 day') ON generate_series = date(date_from)
WHERE version = 1
GROUP BY generate_series
) AS foo
GROUP BY Year
ORDER BY Year ASC;
Run Code Online (Sandbox Code Playgroud)
这是我的输出
"2006-12" | 4
"2007-02" | 1
"2007-03" | 1
Run Code Online (Sandbox Code Playgroud)
但我想得到的是这个输出(1月份的"0"值):
"2006-12" | 4
"2007-01" | 0
"2007-02" | 1
"2007-03" | 1
Run Code Online (Sandbox Code Playgroud)
因此,如果有一个月没有id,那么它应该被列出.任何想法如何解决这个问题?
以下是一些示例数据: …
我使用generate_series在表中插入值.并且generate_series按其范围中的指定插入值.
例如:对于以下查询,
SELECT i AS id, i AS age, i AS house_number
INTO egg
FROM generate_Series(1,6) AS i;
Run Code Online (Sandbox Code Playgroud)
我们得到的结果是:
id age house_number
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
Run Code Online (Sandbox Code Playgroud)
但我的问题是,我想在列"年龄"中仅插入数字3,然后在3之后从0开始:
id age house_number
1 1 1
2 2 2
3 3 3
4 1 4
5 2 5
6 3 6
Run Code Online (Sandbox Code Playgroud)
这可能吗?是否有一些随机函数generate_series()执行相同的功能?
我试过以下:
SELECT * FROM generate_series(2,4);
generate_series
-----------------
2
3
4
(3 rows)
SELECT * FROM generate_series(5,1,-2);
generate_series
-----------------
5
3
1
(3 rows)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时,
select * from generate_series('2011-12-31'::timestamp, '2012-12-31'::timestamp, '1 day');
Run Code Online (Sandbox Code Playgroud)
它产生了错误.
Run Code Online (Sandbox Code Playgroud)ERROR: function generate_series(timestamp without time zone, timestamp without time zone, "unknown") does not exist HINT: No function matches the given name and argument types. You may need to add explicit type casts.
我在Redshift 1.0.757上使用PostgreSQL 8.0.2.
知道为什么会这样吗?
更新:
generate_series现在正在使用Redshift.
SELECT CURRENT_DATE::TIMESTAMP - (i * interval '1 day') as date_datetime …Run Code Online (Sandbox Code Playgroud) 我一直在尝试从时间戳字段中的第一个日期到最后一个日期生成一系列日期(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
Run Code Online (Sandbox Code Playgroud)
Postgres 9.3
我每天使用 Postgres 汇总一组产品的销售额,不仅需要知道何时发生销售,还需要知道何时不进行进一步处理。
SELECT
sd.date,
COUNT(sd.sale_id) AS sales,
sd.product
FROM sales_data sd
-- sales per product, per day
GROUP BY sd.product, sd.date
ORDER BY sd.product, sd.date
Run Code Online (Sandbox Code Playgroud)
这会产生以下结果:
date | sales | product
------------+-------+-------------------
2017-08-17 | 10 | soap
2017-08-19 | 2 | soap
2017-08-20 | 5 | soap
2017-08-17 | 2 | shower gel
2017-08-21 | 1 | shower gel
Run Code Online (Sandbox Code Playgroud)
如您所见 - 每个产品的日期范围不连续,因为sales_data在某些日子里没有包含这些产品的任何信息。
我的目标是为sales = 0某个范围内任何一天都没有售出的每个产品添加一行 - 例如在这里,之间2017-08-17和2017-08-21给出如下所示的内容:
date | sales | …Run Code Online (Sandbox Code Playgroud) postgresql group-by aggregate-functions window-functions generate-series
当我运行SQL查询时:
select generate_series(0,g)
from ( select date(date1) - date(date2) as g from mytable ;
Run Code Online (Sandbox Code Playgroud)
它返回一个错误:
INFO: Function "generate_series(integer,integer)" not supported.
ERROR: Specified types or functions (one per INFO message) not supported
on Redshift tables.
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个查询时:
select generate_series(0, g) from (select 5 as g)
Run Code Online (Sandbox Code Playgroud)
它返回以下响应:
generate_series
-----------------
0
1
2
3
4
5
(6 rows)
Run Code Online (Sandbox Code Playgroud)
为什么第二个查询有效,而第一个查询失败?
我需要为表中每个人的 2 个日期之间的每个月创建一行(结果应该是当月的第一天)。例如,如果我的源表中有以下数据:
rowID | person | startdate | enddate
1 | 12345 | 2014-04-01 | 2014-11-30
2 | 67890 | 2014-03-01 | 2014-05-01
Run Code Online (Sandbox Code Playgroud)
我希望我的目标表中的结果是:
person | month
12345 | 2014-04-01
12345 | 2014-05-01
12345 | 2014-06-01
12345 | 2014-07-01
12345 | 2014-08-01
12345 | 2014-09-01
12345 | 2014-10-01
12345 | 2014-11-01
67890 | 2014-03-01
67890 | 2014-04-01
67890 | 2014-05-01
Run Code Online (Sandbox Code Playgroud)
非常感谢帮忙。
我试图找到与 generate_series() (PostgreSQL 语法)等效的雪花。
SELECT generate_series(timestamp '2017-11-01', CURRENT_DATE, '1 day')
Run Code Online (Sandbox Code Playgroud) 我正在创建一个订阅管理系统,需要生成未来 2 年即将到来的计费日期列表。我已经能够使用 generate_series 来获取适当的日期:
SELECT i::DATE
FROM generate_series('2015-08-01', '2017-08-01', '1 month'::INTERVAL) i
Run Code Online (Sandbox Code Playgroud)
我需要采取的最后一步是从计算中排除特定的日期范围。这些排除的日期范围可以是任何时间范围。此外,它们不应计入 generate_series 的时间范围内。
例如,假设我们有一个从“2015-08-27”到“2015-09-03”的日期范围排除。生成的 generate_series 应该从计算中排除那一周的日期,并且基本上将所有未来月份的计费日期推到未来一周:
2015-08-01
2015-09-10
2015-10-10
2015-11-10
2015-12-10
Run Code Online (Sandbox Code Playgroud) 我有下表:
CREATE TABLE f_contact (
agent character varying,
datetimeconnect timestamp without time zone,
datetimedisconnect timestamp without time zone,
duration integer
);
Run Code Online (Sandbox Code Playgroud)
duration是断开时间和连接时间之间的时间(以秒为单位)。
我可能有这样的数据:
agent datetimeconnect datetimedisconnect duration
20024 2019-03-18 12:01:00.0 2019-03-18 13:01:30.0 3630
20011 2019-03-11 08:47:40.0 2019-03-11 09:30:10.0 2550
Run Code Online (Sandbox Code Playgroud)
我想获取这些数据并将时间分布在 15 分钟的间隔内,这样我得到的结果如下:
20024 12:00 840
20024 12:15 900
20024 12:30 900
20024 12:45 900
20024 13:00 90
20011 08:45 740
20011 09:00 900
20011 09:15 900
20011 09:30 10
Run Code Online (Sandbox Code Playgroud)
如何实现这一目标?
generate-series ×10
postgresql ×7
sql ×4
date ×1
date-range ×1
group-by ×1
join ×1