Postgresql Self-join要查找Postgres中连续行之间的差异,尝试了Self-join,但似乎不起作用

Postgresql Self-join要查找Postgres中连续行之间的差异,尝试了Self-join,但似乎不起作用,postgresql,self-join,window-functions,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,

我试图使用自联接查找两个连续行的字段(本例中为计数器)之间的差异。表名为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
选择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)
从计数器表A,计数器表B
其中A.country=B.country
和A.state=B.state
A.city=B.city
和A.dateandtime>'2013-07-17 22:00:00'
和B.dateandtime>=(A.dateandtime+间隔“29分钟”)

B.dateandtime窗口函数在这里是一个很好的主意。此外,您可能还应该提供一个原始设置的示例,以便让人们了解为什么缺少23:30和00:00。

窗口功能在这里是一个很好的主意。此外,您可能还应该提供原始设置的示例,以便让人们了解为什么缺少23:30和00:00。

我想我有一个解决方案,这似乎是使用窗口函数“lag”处理以下查询,选择城市,lag(日期和时间)OVER(按城市排序,日期和时间)作为prev_dateandtime,dateandtime,lag(counter_1)OVER(按城市、日期和时间排序)与prev_counter、counter_1、counter_1-lag(counter_1)OVER(按城市、日期和时间排序)由于计数器与计数器表的顺序相差1,3;@Biju:您可以回答自己的问题,提供自己的答案比只留下评论要好。我想我有一个解决方案,这似乎是使用窗口函数“lag”处理下面的查询,选择城市,lag(日期和时间)超过(按城市、日期和时间排序)如prev_dateandtime,dateandtime,lag(计数器_1)OVER(按城市排序,日期和时间)如prev_计数器,计数器_1,计数器_1-lag(计数器_1)OVER(按城市排序,日期和时间)如diff_计数器与计数器表的顺序相差1,3;@Biju:你可以回答自己的问题,提供自己的答案比只留下评论要好。