Выберите элементы из таблицы, где отметки времени находятся в течение часа друг от друга - PullRequest
3 голосов
/ 15 июля 2011

Я использую postgres (postgis) и хочу выполнить запрос, который возвращает все строки, имеющие временную метку, в течение часа друг от друга.

Как будет выглядеть инструкция SQL?

Таблица выглядит следующим образом:

  • id {целое число *
  • имя {изменяющийся символ}
  • отметка времени {отметка времени с часовым поясом}

    id   name       timestamp
    ---+----------+--------------------------------
    1    one        "2010-09-24 21:10:39.515+00"
    2    two        "2010-09-16 09:21:09.362+00"
    3    three      "2010-07-08 00:00:46.549+00"
    

РЕДАКТИРОВАТЬ # 1

Вот лучший пример.(с помощью Tometzky) Все результаты в течение 1 часа друг от друга.То есть для каждой строки укажите любые другие строки, которые находятся в пределах 1 часа:

select * from myTable order by t

 id |               t               
----+-------------------------------
  9 | 2011-07-15 18:20:20.05+02
 10 | 2011-07-15 19:05:00.05+02
 11 | 2011-07-15 19:40:20.05+02
 13 | 2011-07-15 20:31:01.05+02
 14 | 2011-07-15 20:35:11.05+02
(5 rows)

result of needed query:

 id |  matchid |  origTime                  | matchTime
----+----------+----------------------------+------------------------------
  9 |   10     | 2011-07-15 18:20:20.05+02  | 2011-07-15 19:05:00.05+02
 10 |    9     | 2011-07-15 19:05:00.05+02  | 2011-07-15 18:20:20.05+02
 10 |   11     | 2011-07-15 19:05:00.05+02  | 2011-07-15 19:40:20.05+02
 11 |   10     | 2011-07-15 19:40:20.05+02  | 2011-07-15 19:05:00.05+02
 11 |   13     | 2011-07-15 19:40:20.05+02  | 2011-07-15 20:31:01.05+02
 11 |   14     | 2011-07-15 19:40:20.05+02  | 2011-07-15 20:35:11.05+02
 13 |   11     | 2011-07-15 20:31:01.05+02  | 2011-07-15 19:40:20.05+02
 13 |   14     | 2011-07-15 20:31:01.05+02  | 2011-07-15 20:35:11.05+02
 14 |   11     | 2011-07-15 20:35:11.05+02  | 2011-07-15 19:40:20.05+02
 14 |   13     | 2011-07-15 20:35:11.05+02  | 2011-07-15 20:31:01.05+02
(10 rows)

Ответы [ 2 ]

3 голосов
/ 15 июля 2011
select 
    t0.id, t1.id as matchid, 
    t0.ts as origTime, t1.ts as matchTime
from t t0
inner join t t1 on 
    t1.ts between 
        t0.ts - interval '1 hour'
        and 
        t0.ts + interval '1 hour'
    and t0.id != t1.id
;
1 голос
/ 15 июля 2011

Примерно так:

$ select * from test;
 id |               t               
----+-------------------------------
  9 | 2011-07-15 18:31:01.059487+02
 10 | 2011-07-15 18:31:01.55044+02
 11 | 2011-07-15 18:31:01.850583+02
 12 | 2011-07-15 18:31:02.064435+02
 13 | 2011-07-15 18:31:02.333449+02
 14 | 2011-07-15 18:31:02.727461+02
 15 | 2011-07-15 18:31:03.279447+02
 16 | 2011-07-15 18:31:03.642454+02
 17 | 2011-07-15 18:33:34.910252+02
 18 | 2011-07-15 18:33:35.995455+02
 19 | 2011-07-15 18:33:36.45246+02
(11 rows)

$ select id, lastid
  from (
    select id,
    t-lag(t) over (order by t) as lag,
    lag(id) over (order by t) as lastid from test
  ) as _
  where lag < '1 second';
 id | lastid 
----+--------
 10 |      9
 11 |     10
 12 |     11
 13 |     12
 14 |     13
 15 |     14
 16 |     15
 19 |     18
(8 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...