2015-06-15 2 views
1

- У меня есть база данных PostgreSQL с таблицейВыбрать интервалы/первое и последнее вхождение комбинаций столбцов из PostgreSQL

CREATE TABLE timer 
(
    id character varying(12), 
    date timestamp without time zone, 
    id1 character varying(10), 
    id2 character varying(10) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE timer 
    OWNER TO postgres; 

- и данные

insert into timer values ('001', '2015-01-01 12:00:00', 100, null); 
insert into timer values ('002', '2015-01-01 12:00:00', 200, null); 
insert into timer values ('003', '2015-01-01 12:00:10', 100, null); 
insert into timer values ('004', '2015-01-01 12:00:10', 200, null); 
insert into timer values ('005', '2015-01-01 12:00:20', 100, 'aaaa'); 
insert into timer values ('006', '2015-01-01 12:00:20', 200, null); 
insert into timer values ('007', '2015-01-01 12:00:30', 100, 'aaaa'); 
insert into timer values ('008', '2015-01-01 12:00:30', 200, null); 
insert into timer values ('009', '2015-01-01 12:00:40', 100, 'aaaa'); 
insert into timer values ('010', '2015-01-01 12:00:40', 200, 'bbbb'); 
insert into timer values ('011', '2015-01-01 12:00:50', 100, 'aaaa'); 
insert into timer values ('012', '2015-01-01 12:00:50', 200, 'bbbb'); 
insert into timer values ('013', '2015-01-01 12:01:00', 100, 'aaaa'); 
insert into timer values ('014', '2015-01-01 12:01:00', 200, 'aaaa'); 
insert into timer values ('015', '2015-01-01 12:01:10', 100, 'aaaa'); 
insert into timer values ('016', '2015-01-01 12:01:10', 200, 'aaaa'); 
insert into timer values ('017', '2015-01-01 12:01:20', 100, null); 
insert into timer values ('018', '2015-01-01 12:01:20', 200, 'aaaa'); 
insert into timer values ('019', '2015-01-01 12:01:30', 100, null); 
insert into timer values ('020', '2015-01-01 12:01:30', 200, 'aaaa'); 
insert into timer values ('021', '2015-01-01 12:01:40', 100, null); 
insert into timer values ('022', '2015-01-01 12:01:40', 200, 'aaaa'); 
insert into timer values ('023', '2015-01-01 12:01:50', 100, 'bbbb'); 
insert into timer values ('024', '2015-01-01 12:01:50', 200, 'aaaa'); 
insert into timer values ('025', '2015-01-01 12:02:00', 100, 'bbbb'); 
insert into timer values ('026', '2015-01-01 12:02:00', 200, 'aaaa'); 

select * from timer; 
id |   date  | id1 | id2 | 
----+---------------------+------+--- ----+ 
001 | 2015-01-01 12:00:00 | 100 | null | 
002 | 2015-01-01 12:00:00 | 200 | null | 
003 | 2015-01-01 12:00:10 | 100 | null | 
004 | 2015-01-01 12:00:10 | 200 | null | 
005 | 2015-01-01 12:00:20 | 100 | aaaa | 
006 | 2015-01-01 12:00:20 | 200 | null | 
007 | 2015-01-01 12:00:30 | 100 | aaaa | 
008 | 2015-01-01 12:00:30 | 200 | null | 
009 | 2015-01-01 12:00:40 | 100 | aaaa | 
010 | 2015-01-01 12:00:40 | 200 | bbbb | 
011 | 2015-01-01 12:00:50 | 100 | aaaa | 
012 | 2015-01-01 12:00:50 | 200 | bbbb | 
013 | 2015-01-01 12:01:00 | 100 | aaaa | 
014 | 2015-01-01 12:01:00 | 200 | aaaa | 
015 | 2015-01-01 12:01:10 | 100 | aaaa | 
016 | 2015-01-01 12:01:10 | 200 | aaaa | 
017 | 2015-01-01 12:01:20 | 100 | null | 
018 | 2015-01-01 12:01:20 | 200 | aaaa | 
019 | 2015-01-01 12:01:30 | 100 | null | 
020 | 2015-01-01 12:01:30 | 200 | aaaa | 
021 | 2015-01-01 12:01:40 | 100 | null | 
022 | 2015-01-01 12:01:40 | 200 | aaaa | 
023 | 2015-01-01 12:01:50 | 100 | bbbb | 
024 | 2015-01-01 12:01:50 | 200 | aaaa | 
025 | 2015-01-01 12:02:00 | 100 | bbbb | 
026 | 2015-01-01 12:02:00 | 200 | aaaa | 

каждые 10 секунд сервер получает новые данные с два ID-s. ID1 и ID2 я должен отображать результат в формате:

|  date_start  |  date_end  | id1 | id2 | 
+---------------------+---------------------+-----+------+ 
| 2015-01-01 12:00:00 | 2015-01-01 12:00:10 | 100 | null | 
| 2015-01-01 12:00:00 | 2015-01-01 12:00:30 | 200 | null | 
| 2015-01-01 12:00:20 | 2015-01-01 12:01:10 | 100 | aaaa | 
| 2015-01-01 12:00:40 | 2015-01-01 12:00:50 | 200 | bbbb | 
| 2015-01-01 12:01:10 | 2015-01-01 12:02:00 | 200 | aaaa | 
| 2015-01-01 12:01:20 | 2015-01-01 12:01:40 | 100 | null | 
| 2015-01-01 12:01:50 | 2015-01-01 12:02:00 | 100 | bbbb | 

результат в формате
первого вхождения комбинаций ID1/ID2 и последним перед id2 изменяется.
так, например, строка с id: 001 начинается со значений: «2015-01-01 12:00:00» id1: 100 id2: null
и первое изменение для этой строки указано в строке id: 005, где id2 становится aaaa
можно сделать это в одном запросе, или я должен делать некоторые вычисления периодически.

ответ

0

Вы можете использовать простые max и min агрегатные функции с GROUP BY получить результат вам нужно:

select min(date) date_start, max(date) date_end, id1, id2 
from timer 
group by id1, id2 
order by date_start, id1 nulls first, id2 nulls first; 
+0

Это не является достаточно точным, поскольку в конце расчета следует рассчитать общее время для каждой комбинации. Эти комбинации могут происходить несколько раз в день и. Таким образом, я могу иметь несколько 100/aaaa начальных интервалов, и между этими интервалами у меня могут быть разные комбинации для каждой из идентификаторов. –

+0

Извините, я неправильно понял ваш вопрос в первый раз. Какой большой стол? Можно выполнять вычисления с использованием хранимой процедуры, но решение с хранимой процедурой требует последовательного цикла через таблицу. – Nicolai

+0

Огромный. несколько сотен id1 (100, 200) и строка для каждого идентификатора каждые 10 секунд 24/7. Моей первой мыслью была хранимая процедура и расчет один раз в день. –

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