自己加入以找到Postgres中连续行之间的差异,尝试自我加入但似乎不起作用

时间:2013-08-02 17:57:36

标签: postgresql self-join window-functions

我试图使用自联接找到两个连续行的字段(在这种情况下是计数器)之间的区别。表名是counter_table,主键是Country + State + City + dateandtime。 dateandtime是一个时间戳字段,数据大约每30分钟插入一次,但有时候数据根本没有插入该间隔,这意味着下一个数据集在1小时后到达,甚至在几个小时后更糟,可以变化。

我现在使用的查询如下

SELECT A.country, A.state, A.city, A.dateandtime, B.dateandtime, A.counter_1, B.counter_1, (B.counter_1 - A.counter_1), A.counter_2, B.counter_2, (B.counter_2 - A.counter_2)
FROM counter_table A, counter_table B
WHERE A.country = B.country
AND A.state = B.state
AND A.city = B.city
AND A.dateandtime > '2013-07-17 22:00:00'
AND B.dateandtime >= (A.dateandtime + interval '29 minutes')
AND B.dateandtime <= (A.dateandtime + interval '33 minutes')
ORDER BY 1,2,3,4;

结果集如下

Country         State   City    Dateandtime A   Dateandtime B   counter_1A  Counter_1B  1B-1A   Counter_2A  Counter_2B  2B-2A
United States   Texas   Austin  7/17/2013 22:00 7/17/2013 22:30 1814166 1814291 125 1762331 1762454 123
United States   Texas   Austin  7/17/2013 22:30 7/17/2013 23:00 1814291 1814389 98  1762454 1762548 94
United States   Texas   Austin  7/17/2013 23:00 7/17/2013 23:30 1814389 1814489 100 1762548 1762640 92
United States   Texas   Austin  7/18/2013 0:30  7/18/2013 1:00  1814647 1814708 61  1762795 1762855 60
United States   Texas   Austin  7/18/2013 1:00  7/18/2013 1:30  1814708 1814758 50  1762855 1762905 50
United States   Texas   Austin  7/18/2013 1:30  7/18/2013 2:00  1814758 1814829 71  1762905 1762975 70
United States   Texas   Austin  7/18/2013 2:00  7/18/2013 2:30  1814829 1814892 63  1762975 1763037 62
United States   Texas   Austin  7/18/2013 2:30  7/18/2013 3:00  1814892 1814977 85  1763037 1763122 85
United States   Texas   Austin  7/18/2013 3:00  7/18/2013 3:30  1814977 1815056 79  1763122 1763200 78
United States   Texas   Austin  7/18/2013 3:30  7/18/2013 4:00  1815056 1815105 49  1763200 1763249 49

这显然不是正确的解决方案,在这种情况下缺少23:30和00:00的记录。一些Postgres专家能帮忙吗?窗口功能是解决此问题的好方法吗?

1 个答案:

答案 0 :(得分:1)

窗口函数在这里是一个很好的主意。此外,您应该提供原始集的示例,以便人们能够找出23:30和00:00丢失的原因。