2013-08-02 3 views
1

Я пытаюсь найти разницу между полями (счетчики в этом случае) двумя последовательными строками, используя самосоединение. Имя таблицы - 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? Являются ли оконные функции хорошим решением для этой проблемы?

ответ

1

Оконные функции были бы отличной идеей здесь. Кроме того, вы должны, вероятно, предоставить пример исходного набора, чтобы люди могли понять, почему отсутствуют 23:30 и 00:00.

+0

Я думаю, у меня есть решение, Это, кажется, работает с ниже запроса, используя функцию окна «лаг» 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

+2

@Biju: Вы можете ответить на свои вопросы, если ваш собственный ответ будет лучше, чем просто оставить комментарий. –

Смежные вопросы