在30分钟间隔内获得COUNT小时

时间:2014-01-20 09:43:37

标签: postgresql

我有以下数据。

Date    Interval
2014-01-01  12:00 AM
2014-01-01  12:30 AM
2014-01-01  1:00 AM
2014-01-01  1:30 AM
2014-01-01  2:00 AM
2014-01-01  2:30 AM
2014-01-01  3:00 AM
2014-01-01  3:30 AM
2014-01-01  4:00 AM
2014-01-01  4:30 AM

我需要提取间隔列的小时。

我可以使用EXTRACT('hour', Interval)来完成,它会将小时数作为int

结果如下:

Date    Interval    HourCount
2014-01-01  12:00 AM    0
2014-01-01  12:30 AM    0
2014-01-01  1:00 AM 1
2014-01-01  1:30 AM 1
2014-01-01  2:00 AM 2
2014-01-01  2:30 AM 2
2014-01-01  3:00 AM 3
2014-01-01  3:30 AM 3
2014-01-01  4:00 AM 4
2014-01-01  4:30 AM 4

但我正在寻找的是。我需要每30分钟计数一次。

我正在寻找的数据示例。

Date    Interval    HourCount
2014-01-01  12:00 AM    1
2014-01-01  12:30 AM    2
2014-01-01  1:00 AM 3
2014-01-01  1:30 AM 4
2014-01-01  2:00 AM 5
2014-01-01  2:30 AM 6
2014-01-01  3:00 AM 7
2014-01-01  3:30 AM 8
2014-01-01  4:00 AM 9
2014-01-01  4:30 AM 10

这样,在一天之内,我会得到48个间隔。

我可以使用ROW_NUMBER() OVER (PARTITION BY Date ORDER BY Date)。但如果错过任何间隔,这将给我错误的计数。

假设错过了以下行。

2014-01-01  4:00 AM 9

我将获得9作为此行的HourCount。

2014-01-01  4:30 AM 9

有人帮助我按照30分钟的间隔计算小时数。

2 个答案:

答案 0 :(得分:0)

尝试类似:

with series as 
(select interval_num, interval_num * interval '30 minutes' as interval_time
from generate_series(0,47) series(interval_num))

select *
from data_table
right join series on series.interval_time = data_table.interval

答案 1 :(得分:0)

就像你写的那样,你可以提取小时,你缺少的是你也可以提取分钟,然后检查它们是否大于或等于30。

SELECT date_part('hour', interval) * 2 + CASE WHEN date_part('minute', interval) >= 30 THEN 1 ELSE 0 END