我正在尝试为天数列表选择 24 小时数据 block 并保留开始日期。用表格描述更容易,所以我会这样做:
原始表
ID localminute Usage
1 01-01-2013 00:00:00-05 3
.
.
1 12-31-2013 00:00:00-05 4
2
.
.
假设我感兴趣的日期是 2 月 1 日和 2 月 12 日。那么我想要的是从 2 月 1 日上午 8 点到 2 月 2 日上午 07:59 以及 2 月 12 日上午 8 点到 2 月 13 日上午 7:59 的总使用量。
这将针对每个人,因此我的输出将是:
ID Eventday Total
1 02-01-2013 78
1 02-01-2013 89
2 02-13-2013 94
2 02-13-2013 67
.
.
我的问题是将我开始计算项目的日期添加到事件日,即情况 1 中的 2 月 1 日和第二种情况中的 2 月 13 日,由于日期重叠,我不确定该怎么做。我获取聚合减去日期的简单查询如下:
create table aggregates as
select id, sum(usage) as total
from source_table
where localminute between '02-01-2013 08:00' AND '02-02-2013 07:59'
group by dataid
union
same as above for February 13th.
如果我选择日期列并添加日期列,因为它在 group by 语句中,我无法控制日期项,因为它随机出现为 02-01-2013 或 02-02-2013,具体取决于情况。
有没有办法通过将我的日期存储在列表等中来为每次迭代或其他一些解决方法手动将日期输入到列中?
如有任何帮助,我们将不胜感激!
最佳答案
看起来您想要的是将上午 8 点之前发生的所有事情都计入前一天。在这种情况下,您可以将时间戳偏移 8 小时,截断当天,并将其用于分组。
SELECT id, date_trunc('day', localminute - '8 hours'::interval)::date,
SUM(usage)
FROM source_table
GROUP BY id, date_trunc('day', localminute - '8 hours'::interval)
如果您只对 01 Feb 2013 08:00
之间的数据感兴趣和 13 Feb 2013 08:00
, 您可以添加 WHERE localminute >= '01 Feb 2013 08:00'::timestamptz AND localminute < '13 Feb 2013 08:00'::timestamptz
(在 GROUP BY
之前)。
我会避免 '02-02-2013 07:59'
并在 '02-13-2013 08:00'
上求一个严格的不等式, 以便能够捕获最后一分钟发生的条目 ( BETWEEN
includes the end of the range )。或者,如果您使用的是足够新的 PostgreSQL 版本,则可以使用 range type ,尽管对于像这样相当短的东西,两个不等式(如上所述)似乎是合理的。
关于postgresql - Postgres : Selecting a 24 hour window for multiple dates and picking the initial date as start date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167041/