自己結合を使用して、フィールド (この場合はカウンター) の 2 つの連続する行の違いを見つけようとしています。テーブル名は 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;
結果セットは以下の通り
国 州 市 日時 A 日時 B カウンター_1A カウンター_1B 1B-1A カウンター_2A カウンター_2B 2B-2A 米国 テキサス州 オースティン 2013 年 7 月 17 日 22:00 2013 年 7 月 17 日 22:30 1814166 1814291 125 1762331 1762454 123 米国 テキサス州 オースティン 2013 年 7 月 17 日 22:30 2013 年 7 月 17 日 23:00 1814291 1814389 98 1762454 1762548 94 米国 テキサス州 オースティン 2013 年 7 月 17 日 23:00 2013 年 7 月 17 日 23:30 1814389 1814489 100 1762548 1762640 92 米国 テキサス州 オースティン 2013 年 7 月 18 日 0:30 2013 年 7 月 18 日 1:00 1814647 1814708 61 1762795 1762855 60 米国 テキサス州 オースティン 2013 年 7 月 18 日 1:00 2013 年 7 月 18 日 1:30 1814708 1814758 50 1762855 1762905 50 米国 テキサス州 オースティン 2013 年 7 月 18 日 1:30 2013 年 7 月 18 日 2:00 1814758 1814829 71 1762905 1762975 70 米国 テキサス州 オースティン 2013 年 7 月 18 日 2:00 2013 年 7 月 18 日 2:30 1814829 1814892 63 1762975 1763037 62 米国 テキサス州 オースティン 2013 年 7 月 18 日 2:30 2013 年 7 月 18 日 3:00 1814892 1814977 85 1763037 1763122 85 米国 テキサス州 オースティン 2013 年 7 月 18 日 3:00 2013 年 7 月 18 日 3:30 1814977 1815056 79 1763122 1763200 78 米国 テキサス州 オースティン 2013 年 7 月 18 日 3:30 2013 年 7 月 18 日 4:00 1815056 1815105 49 1763200 1763249 49
これは明らかに正しい解決策ではありません。この場合、23:30 と 00:00 のレコードが欠落しています。Postgre の専門家が助けてくれますか? ウィンドウ関数はこの問題の良い解決策ですか?