我试图使用自联接找到两个连续行的字段(在这种情况下是计数器)之间的区别。表名是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专家能帮忙吗?窗口功能是解决此问题的好方法吗?
答案 0 :(得分:1)
窗口函数在这里是一个很好的主意。此外,您应该提供原始集的示例,以便人们能够找出23:30和00:00丢失的原因。