我有一个表,其中包含id-s(id_code
)的列和事务的时间(time
)。我需要的是找出没有交易的每个id的两个日期之间的小时数。假设我需要检查下面between 2014-06-13 12:00:00 and 2014-06-13 14:59:59
表中id 1和id 2的缺失时间 - 期望的结果是id 1缺少事务2014-06-13 13:00:00并且缺少id 2交易2014-06-13 14:00:00。
id_code | time
1 | 2014-06-13 12:23:12
2 | 2014-06-13 12:27:23
1 | 2014-06-13 12:56:21
2 | 2014-06-13 13:34:12
1 | 2014-06-13 14:23:56
我正在使用 PostgreSQL 9.3
答案 0 :(得分:1)
select c.id, d.time
from
(
select distinct id
from t
) c
cross join
generate_series (
(select date_trunc('hour', min(t.time)) from t),
(select date_trunc('hour', max(t.time)) from t),
interval '1 hour'
) d(time)
left join
(
select id, date_trunc('hour', t.time) as time
from t
group by id, 2
) t on t.time = d.time and c.id = t.id
where t.time is null
order by c.id, d.time
generate_series
将构建一组所有可能的小时。交叉连接将使所有可能小时的所有可能ID的矩阵成为可能。然后t.time is null
条件将过滤那些不存在的id x小时。
答案 1 :(得分:1)
SELECT DISTINCT id, h FROM t, generate_series('2014-06-13 12:00:00'::timestamp, '2014-06-13 14:59:59'::timestamp, '1 hour') h
EXCEPT
SELECT id, date_trunc('hour', time) FROM t
感谢Clodoaldo Neto为测试提供了一个有用的SQL Fiddle页面!