从sql中的两个表中选择固定数量的行

时间:2010-11-02 13:21:05

标签: sql postgresql

我有两张桌子

table1 (p double precesion, t timestamp without zone) 

table2 (v double precision, t timestamp without zone) 

每分钟的值。

如何在指定的时间内为每分钟选择60行表格(t,v,p)?

某些值可能不存在,在这种情况下,相应的返回值应为NULL。

每小时必须有60行。

我使用PostgreSQL。

1 个答案:

答案 0 :(得分:1)

SELECT  '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL, v, p
FROM    generate_series(0, 59) m
LEFT JOIN
        table1 t1
ON      t1.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL
        AND t1.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL
LEFT JOIN
        table2 t2
ON      t2.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL
        AND t2.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL

这假设记录在每分钟内是唯一的(尽管秒数可能会有所不同)。

如果不是,您将收到重复的内容。

在这种情况下,您可能想要聚合它们(比如总和):

SELECT  '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL,
        COALESCE
        (
        SELECT  SUM(p)
        FROM    table1 t1
        WHERE   t1.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL
                AND t1.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL
        ), 0) p,
        COALESCE
        (
        SELECT  SUM(v)
        FROM    table2 t2
        WHERE   t2.t >= '2010-01-01 01:00:00'::DATE + (m || ' minute')::INTERVAL
                AND t2.t < '2010-01-01 01:00:00'::DATE + (m + 1 || ' minute')::INTERVAL
        ), 0) v
FROM    generate_series(0, 59) m