Postgresql:使用'with子句'迭代一系列日期

时间:2014-12-10 12:04:00

标签: postgresql common-table-expression

我有一个包含start visdate和end visdate的数据库表。如果日期在此范围内,则资产标记为可用。资产属于用户。我的查询包含日期范围(开始和结束日期)。我需要返回数据,以便在日期范围内查询数据库并返回资产可用日期范围内每天的资产计数。

我知道有一些例子,我想知道是否可以将它作为查询/公用表表达式而不是使用函数或临时表来执行。我也发现它非常复杂,因为资产表不包含资产可用的日期。我正在查看可见性窗口的一系列日期。做这个的最好方式是什么?我应该在我给出的日期范围内对每一天进行单独的查询吗?

Asset Table
StartvisDate Timestamp
EndvisDate   Timestamp
ID           int

User Table
ID

User & Asset Join table
UserID
AssetID


Date       | Number of Assets Available | User
11/11/14              5                   UK
12/11/14              6                   Greece
13/11/14              4                   America
14/11/14              0                   Italy

1 个答案:

答案 0 :(得分:1)

您需要使用set returning function来生成所需的行。请参阅此相关问题:

SQL/Postgres datetime division / normalizing

让您入门的示例查询:

with data as (
  select id, start_date, end_date
  from (values
    (1, '2014-12-02 14:12:00+00'::timestamptz, '2014-12-03 06:45:00+00'::timestamptz),
    (2, '2014-12-05 15:25:00+00'::timestamptz, '2014-12-05 07:29:00+00'::timestamptz)
  ) as rows (id, start_date, end_date)
)
select data.id,
       count(data.id)
from data
join generate_series(
      date_trunc('day', data.start_date),
      date_trunc('day', data.end_date),
      '1 day'
      ) as days (d)
      on days.d >= date_trunc('day', data.start_date)
      and days.d <= date_trunc('day', data.end_date)
group by data.id

 id | count 
----+-------
  1 |     2
  2 |     1
(2 rows)

您希望将其转换为使用范围,并将其调整为您自己的架构和数据,但它与您想要的查询基本相同。