标签: generate-series

PostgreSQL:如何使用generate_series()找出列中缺少的数字?

SELECT commandid 
FROM results 
WHERE NOT EXISTS (
    SELECT * 
    FROM generate_series(0,119999) 
    WHERE generate_series = results.commandid 
    );
Run Code Online (Sandbox Code Playgroud)

我有一个results类型的列,int但各种测试失败,并没有添加到表中.我想创建一个返回commandid未找到的列表的查询results.我认为上面的查询会做我想要的.但是,如果我使用超出预期可能范围的范围commandid(如负数),它甚至不起作用.

postgresql postgresql-8.4 generate-series

5
推荐指数
2
解决办法
4278
查看次数

按数据间隔分组

我有一个表,可以在一段时间内存储网络上的带宽使用情况.一列将包含日期时间(主键),另一列将记录带宽.每分钟记录一次数据.我们将在那个时刻记录其他数据.

如果用户以15分钟的间隔(在给定的开始和结束日期的24小时内)请求数据,是否可以使用单个查询来获取我需要的数据,或者我是否必须编写存储过程/光标来执行此操作?然后,用户可以请求5分钟间隔数据等.

我很可能会使用Postgres但是还有其他NOSQL选项会更好吗?

有任何想法吗?

sql postgresql aggregate-functions nosql generate-series

5
推荐指数
2
解决办法
5513
查看次数

根据另一个表中的数字在一个表中插入多行

我是在MacOSX上首次使用Postgres 9.3创建数据库.

假设我有桌子AB.Table A从空虚和Table B充满开始.我想的条目的数量在列all_names在表B为等于number每个namesA等表B的下方.因此,names应包含每个唯一的入口all_namesnumber计数.我还不习惯语法,所以我真的不知道如何去做.该birthday列是多余的.

一个

names | number
-------+------------
Carl  | 3
Bill  | 4
Jen   | 2
Run Code Online (Sandbox Code Playgroud)

 all_names | birthday
-------+------------
Carl       | 17/03/1980
Carl       | 22/08/1994
Carl       | 04/09/1951
Bill       | 02/12/2003
Bill       | 11/03/1975
Bill       | 04/06/1986
Bill       | 08/07/2005
Jen        | 05/03/2009
Jen        | 01/04/1945
Run Code Online (Sandbox Code Playgroud)

更新:这是正确的方法吗? …

sql postgresql relational-database generate-series

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

PostgreSQL将时间范围分成几天

我正在尝试使用PostgreSQL 9.2.4编写一个复杂的查询,但我无法正常工作.我有一个包含时间范围的表,以及其他几个列.当我在此表中存储数据时,如果所有列都相同且时间范围重叠或相邻,我将它们组合成一行.

但是当我检索它们时,我想在天边界处分割范围 - 例如:

2013-01-01 00:00:00 to 2013-01-02 23:59:59
Run Code Online (Sandbox Code Playgroud)

将被选为两行:

2013-01-01 00:00:00 to 2013-01-01 23:59:59
2013-01-02 00:00:00 to 2013-01-02 23:59:59
Run Code Online (Sandbox Code Playgroud)

对于两个检索到的条目,其他列中的值相同.

我已经看到这个问题似乎或多或少地解决了我想要的问题,但它适用于PostgreSQL的"非常旧"版本,所以我不确定它是否仍然适用.

我也看到了这个问题,它完全符合我的要求,但据我所知,该CONNECT BY语句是SQL标准的Oracle扩展,所以我不能使用它.

我相信我可以使用PostgreSQL来实现这一点generate_series,但我希望有一个简单的例子可以证明它是如何用来做到这一点的.

这是我目前正在处理的查询,目前无效(因为我无法FROM在连接的子查询中引用该表),但我相信这或多或少是正确的轨道.

这里是架构,示例数据和我的工作查询的小提琴.

更新:我刚刚发现一个有趣的事实,感谢这个问题,如果你SELECT在查询的一部分中使用set-returning函数,PostgreSQL将"自动"在集合和行上进行交叉连接.我想我已接近完成这项工作.

sql postgresql date-range generate-series

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

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
查看次数

Postgres generate_series

我想要的是在桌子上进行统计,为此我正在使用 generate_series();

这是我正在做的事情:

SELECT x.month, amount
FROM (SELECT generate_series(
                 min(date_trunc('month', date)),
                 max(date_trunc('month', date)),
                 '1 month'
      ) AS month
      FROM table
      WHERE user_id = 55 AND ...
) x
LEFT JOIN (
      SELECT SUM(amount) AS amount, date_trunc('month', date) AS month
      FROM table
      WHERE user_id = 55 AND ...
      GROUP BY month
) q ON q.month = x.month
ORDER BY month
Run Code Online (Sandbox Code Playgroud)

这很好但但是当我想应用过滤器时,如果需要获取特定用户的数量,我必须将它们应用两次.有没有办法避免过滤两次,或以更有效的方式重写它,因为我不确定这是否是正确的方法?

sql postgresql generate-series

4
推荐指数
2
解决办法
9550
查看次数

使用给定期间的第一天和最后一天创建列表

我必须为特定时期内的每个月生成一个包含两列天间隔的列表。第一列必须是一个月的第一天,第二列必须是一个月的最后一天。

示例:
开始日期:2014-01-01
结束日期:2014-06-30

结果应该在两列中:

1. 2014-01-01 | 2014-01-31
2. 2014-02-01 | 2014-02-28
3. 2014-03-01 | 2014-03-31
4. 2014-04-01 | 2014-04-30
5. 2014-05-01 | 2014-05-31
6. 2014-06-01 | 2014-06-30
Run Code Online (Sandbox Code Playgroud)

我有两个函数可以从日期中获取第一天和最后一天。我试图结合两个系列,但没有运气。

select i::date
from generate_series(first_day('2014-01-01')
                    ,first_day('2014-06-30'), '1 month'::interval) i

select i::date
from generate_series(last_day('2014-01-01')
                    ,last_day('2014-06-30'), '1 month'::interval) i
Run Code Online (Sandbox Code Playgroud)

当它在系列中时,第二个函数不能正确显示最后一天。

sql postgresql date-range generate-series

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

从 PostgreSQL 中的行生成系列

我有一个表,reservations其中有两列(started_at, 和ended_at)。我想构建一个查询,将预订行扩展到他们各自的日子。因此,例如,如果预订持续了 5 天,我希望为它返回 5 行。类似的东西:

电流输出

id | started_at | ended_at
----------------------------
1  | 2016-01-01 | 2016-01-05
2  | 2016-01-06 | 2016-01-10
Run Code Online (Sandbox Code Playgroud)

期望输出

id | date
---------------
1  | 2016-01-01
1  | 2016-01-02
1  | 2016-01-03
1  | 2016-01-04
1  | 2016-01-05
2  | 2016-01-06
2  | 2016-01-07
2  | 2016-01-08
2  | 2016-01-09
2  | 2016-01-10
Run Code Online (Sandbox Code Playgroud)

我认为这generate_series可能在这里有用,但我不确定语法。任何帮助是极大的赞赏

SQL小提琴

http://sqlfiddle.com/#!15/f0135/1

sql postgresql generate-series

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

postgreSQL 中的 CASE 不允许使用返回集合的函数

我正在尝试运行此查询,直到不久前才能够运行。我不知道出了什么问题,我现在开始收到此错误?

Your database returned: ERROR: set-returning functions are not allowed in CASE Hint: You might be able to move the set-returning function into a LATERAL FROM item.

我的查询:

SELECT distinct
(CASE
WHEN {PERIOD} = 'Previous Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date AND pto.pto_end_date >= (date_trunc('quarter', now() - INTERVAL '1 month') + INTERVAL '1 month')::date
THEN generate_series(pto.pto_start_date, pto.pto_end_date, '2 day'::interval)
WHEN {PERIOD} = 'Current Quarter' AND pto.pto_start_date < (date_trunc('quarter', now() - INTERVAL '1 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql sql-function generate-series chartio

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