标签: generate-series

在postgres中的generate_series上加入计数查询,并将Null值检索为"0"

我想是从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,那么它应该被列出.任何想法如何解决这个问题?

以下是一些示例数据: …

sql postgresql join postgresql-9.1 generate-series

10
推荐指数
1
解决办法
1万
查看次数

插入值(generate_series) - 如何重用/循环数字,例如1,2,3,1,2,3

我使用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()执行相同的功能?

postgresql generate-series

8
推荐指数
1
解决办法
8117
查看次数

Amazon Redshift中的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)

它产生了错误.

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.
Run Code Online (Sandbox Code Playgroud)

我在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)

generate-series amazon-redshift

7
推荐指数
2
解决办法
4284
查看次数

Postgres中的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_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

sql postgresql aggregate-functions generate-series

7
推荐指数
2
解决办法
2万
查看次数

在 Postgres 中聚合多个字段时填充缺失的行

我每天使用 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-172017-08-21给出如下所示的内容:

    date    | sales | …
Run Code Online (Sandbox Code Playgroud)

postgresql group-by aggregate-functions window-functions generate-series

7
推荐指数
1
解决办法
1039
查看次数

在Redshift中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)

为什么第二个查询有效,而第一个查询失败?

generate-series amazon-redshift

6
推荐指数
2
解决办法
6864
查看次数

在 PostgreSQL 中为 2 个日期之间的每个月创建一行

我需要为表中每个人的 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)

非常感谢帮忙。

postgresql date-range generate-series postgresql-9.3

6
推荐指数
1
解决办法
3902
查看次数

generate_series() 相当于雪花

我试图找到与 generate_series() (PostgreSQL 语法)等效的雪花。

SELECT generate_series(timestamp '2017-11-01', CURRENT_DATE, '1 day')
Run Code Online (Sandbox Code Playgroud)

sql generate-series snowflake-cloud-data-platform

6
推荐指数
4
解决办法
5760
查看次数

Postgres generate_series 不包括日期范围

我正在创建一个订阅管理系统,需要生成未来 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)

postgresql date generate-series

5
推荐指数
1
解决办法
1881
查看次数

将时间分配到间隔桶中

我有下表:

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)

如何实现这一目标?

sql postgresql date-arithmetic generate-series

5
推荐指数
1
解决办法
1482
查看次数