Я пытаюсь найти разницу между полями (счетчики в этом случае) двумя последовательными строками, используя самосоединение. Имя таблицы - counter_table, а первичный ключ - Country + State + City + dateandtime. Дата и время - это поле метки времени, и данные вставляются приблизительно каждые 30 минут, но бывают случаи, когда данные не вставляются вообще для этого интервала, а это означает, что следующий набор данных поступает через 1 час или даже хуже через несколько часов, это может изменяться.Соединиться, чтобы найти разницу между последовательными строками в Postgres, попытался присоединиться, но не работает
Запрос, который я использую в настоящее время, как показано ниже
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
Это obvously не является правильным решением, записи для 23:30 и 00: 00 в этом случае отсутствуют. Могут ли помочь некоторые специалисты Postgres? Являются ли оконные функции хорошим решением для этой проблемы?
Я думаю, у меня есть решение, Это, кажется, работает с ниже запроса, используя функцию окна «лаг» SELECT город лаг (dateandtime) OVER (ORDER BY города, dateandtime) в prev_dateandtime, \t dateandtime, лаг (counter_1) OVER (ORDER BY city, dateandtime) AS prev_counter, \t counter_1, counter_1 - lag (counter_1) OVER (ORDER BY city, dateandtime) AS diff_counter FROM counter_table заказ от 1,3; – Biju
@Biju: Вы можете ответить на свои вопросы, если ваш собственный ответ будет лучше, чем просто оставить комментарий. –