检查表中每个id的缺失小时数

时间:2014-06-13 08:49:39

标签: postgresql

我有一个表,其中包含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

2 个答案:

答案 0 :(得分:1)

SQL Fiddle

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页面!